<jupyter_start><jupyter_text>konlpy로 synop 명사 추출 CountVectorizer, cosine_similarity 1. synop내 명사만으로는 유사도 계산 부정확2. 제목, 태그, 대분류 완료 후  다시 계산3. 불용어 제거4. 다른 방송국 전체 데이터5. 유사도 계산도 트레이닝이 필요한 것인가?6. TfidfVectorizer은 다른 nb에 작성(-> TF, IDF 계산 식에 가중치 부여 가능여부?)7. 각 idx에 추천 epi idx column 추가<jupyter_code>import pandas as pd
import numpy as np
from konlpy.tag import *
#from ast import literal_eval
metadata = pd.read_csv('data_nountag_ebs.csv', encoding='cp949')
metadata.head()
metadata['synop'][755]
len(metadata['synop'])
#이 노트북에선 안씀
from sklearn.feature_extraction.text import TfidfVectorizer
#features = ['epi','synop','tag','big']<jupyter_output><empty_output><jupyter_text>Synop에서 명사 추출 konlpy Hannanum<jupyter_code>han = Hannanum()
#kkma = Kkma()
#okt = Okt()
# 메타데이터의 synop을 synoplist에 넣은 후 명사 추출
synoplist = metadata['synop']
synoplist.head()
# 불용어 제거 안함.
han.nouns(synoplist[0])
# 에피소드 제목의 명사를 계산에 사용?
#불용어 제거 안함
epilist = metadata['epi']
han.nouns(epilist[925])
len(synoplist)
s_nounslist = []

for synop in synoplist:
    s_nouns = ' '.join(han.nouns(synop))
    #print(s_nouns)
    s_nounslist.append(s_nouns)

s_nounslist[0]<jupyter_output><empty_output><jupyter_text>명사 문장 시놉으로 새 데이터프레임 만들기<jupyter_code>metadata = pd.DataFrame({'idx':metadata['idx'],'epi':metadata['epi'], 'n_synop':s_nounslist, 'tag':metadata['tag']})

metadata.head(3)
#metadata.to_csv('ebs_nsynop.csv', encoding='utf-8')<jupyter_output><empty_output><jupyter_text>CountVectorizer<jupyter_code>from sklearn.feature_extraction.text import CountVectorizer

#1개 이하로 나오는 단어 제외
count = CountVectorizer(min_df=2)
#count_matrix = count.fit_transform(metadata)
count_matrix = count.fit_transform(metadata['n_synop'])
count_matrix.shape<jupyter_output><empty_output><jupyter_text>코사인 유사도 점수 계산<jupyter_code>from sklearn.metrics.pairwise import cosine_similarity

cosine_sim2 = cosine_similarity(count_matrix, count_matrix)
# index는 dataframe의 idx
indices = pd.Series(metadata.index, index=metadata['idx'])
def get_recommendations(idx, cosine_sim2=cosine_sim2):
    #제목과 일치하는 에피소드 인덱스 가지고옴
    idx = indices[idx]
    
    sim_scores = list(enumerate(cosine_sim2[idx]))
    
    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
    
    #비슷한 에피소드 상위 10개
    sim_scores = sim_scores[1:11]
    
    # indices
    epi_indices = [i[0] for i in sim_scores]
    
        
    return metadata['epi'].iloc[epi_indices]<jupyter_output><empty_output><jupyter_text>나중에 epi & recommedation epi, index 한번에 출력 함수 만들기<jupyter_code>print('episode : ' + metadata['epi'][236])
get_recommendations(236, cosine_sim2)
print('episode : '+ metadata['epi'][400])
get_recommendations(400, cosine_sim2)
def recommender(idx):
    print('episode : ' + metadata['epi'][idx])
    
    get_recommendations(idx, cosine_sim2)
    
recommender(0)<jupyter_output>episode : 비밀의 땅 파미르   2부 비밀의 땅 숨겨진 강
{'fraction_non_alphanumeric': 0.12627506155469576, 'fraction_numerical': 0.017587055926837847, 'mean_word_length': 5.970588235294118, 'pattern_counts': {'":': 0, '<': 24, '<?xml version=': 0, '>': 25, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '622825', 'license': 'MIT', 'n_tokens_mistral': 1374, 'n_tokens_neox': 1530, 'n_words': 226, 'path': 'Recommender/recommender system_CountVectorizer_ebs_test_ver1.ipynb', 'repo_name': 'DayoungHong/Recommender-system', 'size': '2843'}