๐๐ป ์ฐธ์ฌ ์ธ๊ฐ : ๋ฅ๋ฌ๋์ ํ์ฉํ ์ถ์ฒ์์คํ
๊ตฌํ ์ฌ์ธ์ ํจํค์ง Online.
๋ฐ์ผ๋ฆฌ ๋ฏธ์
์งํ ๊ธฐ๊ฐ(66์ผ)์ผ ๋์ ์งํ๋๋ค. ์ ๋ฐ ์ด๋ฒ์๋ ๊ผญ ์ฑ๊ณตํ๊ธฐ๋ฅผ ๐๐ป Plz
์ค๋ ๋ค์ ์ธ๊ฐ
[Part2] 03-06. TF-IDF๋ --
์ค๋ ๋ฐฐ์ด ๋ด์ฉ
: Vector Representation
- review ๋ฌธ์ ์ ์ฒด์ ๋ฑ์ฅํ๋ ๋จ์ด์ ์๋ n๊ฐ
- m๊ฐ์ review ๋ฌธ์๊ฐ ์๋ค๊ณ ๊ฐ์
- m๊ณผ n์ ์กฐํฉ
- ๋น๋์๋ฅผ ๊ฐ์ง๊ณ ํ์ฉํจ.
:TF - IDF
- ํํ๊ฒ ๋ฑ์ฅํ๋ ๋จ์ด๋ ์ค์ํ์ง ์์ ๋จ์ด
- Information Retrieval์์ ๋ง์ด ์ฌ์ฉํ๋ ๊ฐ๋
- ๊ฐ ๋จ์ด์์ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํด์ Keyword extraction ๋ฑ์ ํ์ฉ
- ๋ฌธ์์์ ํน์ ๋จ์ด๊ฐ ๋ฑ์ฅํ๋ ๊ฒ์ผ๋ก ๋ฌธ์๋ผ๋ฆฌ ๊ด๋ จ์์์ ํํํ ์ ์์.
- TF : ๋จ์ด๊ฐ ๋ฌธ์์ ๋ฑ์ฅํ ๋น๋์
- DF : ๋จ์ด๊ฐ ๋ฑ์ฅํ ๋ฌธ์์ ์
- N : ์ ์ฒด ๋ฌธ์์ ์
๋ง์ฝ ์ด๋ค ๋จ์ด๊ฐ ๋ชจ๋ ๋ฌธ์์์ ๋ฑ์ฅํ๋ค๋ฉด ํํ๋ค๊ณ ๊ฐ์ฃผํ๊ณ ๊ทธ ๋จ์ด์ ์ ๋ณด๋ ฅ์ ์๋ค๊ณ ํ๋จํจ
- DF๊ฐ ํฐ ๋จ์ด๋ ์ ๋ณด๋ ฅ์ด ์ ๋ค.
- ๋ฌธ์ (๋ง๋ญ์น)์ ๋ชจ๋ ํฌํจ๋ ๋จ์ด๋ ํํ ๋ฑ์ฅํ๋ ๋จ์ด๋ก, ์๋ฏธ๊ฐ ํฌ์ง ์์.
- ํํ๊ฒ ๋ฑ์ฅํ๋ ๋จ์ธใด ์ ์ฌ๋ ๊ณ์ฐ์์๋ ์ ์ธํ๊ฒ ๋จ.
- ๋๋ถ๋ถ ๋ฌธ๋ฒ์ ์ธ ์ญํ ์ ํ๋ ์กฐ์ฌ, ๊ด์ฌ ๋ฑ์ด ํด๋น.
- TF๋ ํด๋น ์ธ์ด๊ฐ ํด๋น ๋ฌธ์์ ์๋ง๋ ์์ฃผ ๋ฑ์ฅํ๋์ง ์ฒดํฌ
- IDF๋ ํด๋น ๋จ์ด๊ฐ ์ผ๋ง๋ ๋ค๋ฅธ ๋ฌธ์์์ ํน๋ณํ์ง ์ฒดํฌ
--
์ค์ต์ ์งํํ์๋๋ฐ, ์ธ์์ ๊ธ๊ฒฉํ๊ฒ ์ด๋ ค์์ง๋ค.
์๋ง ํ์ด์ฌ ๋ฌธ๋ฒ์ด ์ข ์ฝํด์ ๊ทธ๋ฐ๊ฐ?
- ํน์๋ฌธ์๋ฅผ ์ ์ฒ๋ฆฌํ๋ ํจ์ ์์ฑ
- ๋ด์ค ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
- with as ๊ฐ์ฒด ์ฌ์ฉ
- ๋ช
์ฌ๋ง ์ถ์ถํ๊ธฐ
- ๋ฌธ์ฅ ๋ถ๋ฆฌํด์ ์ฌ์ฉํ๊ธฐ
- Scikit-learn์ ์ด์ฉํ์ฌ TF-IDF
- TfidfVectorizer
import os
import pandas as pd
import numpy as np
from tqdm import tqdm
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
path = '/content/drive/MyDrive/data/movielens'
ratings_df = pd.read_csv(os.path.join(path, 'ratings.csv'), encoding = 'utf-8')
movies_df = pd.read_csv(os.path.join(path, 'movies.csv'), index_col ='movieId', encoding= 'utf-8')
tags_df = pd.read_csv(os.path.join(path, 'tags.csv'), encoding='utf-8')
total_count = len(movies_df.index)
total_genres = list(set([genre for sublist in list(map(lambda x: x.split('|'),
movies_df['genres'])) for genre in sublist]))
genre_count = dict.fromkeys(total_genres)
for each_genre_list in movies_df['genres']:
for genre in each_genre_list.split('|'):
if genre_count[genre] == None:
genre_count[genre] = 1
else:
genre_count[genre] = genre_count[genre]+1
genre_count
for each_genre in genre_count:
genre_count[each_genre] = np.log10(total_count/genre_count[each_genre])
# ์ฅ๋ฅด ๊ฐ์ค์น๋ฅผ ๊ณ์ฐ ํ๊ฒ ๋ค๋ ์๋ฏธ์. Drama์ ๊ฒฝ์ฐ ๋ง์ด ๋์ ๊ฐ์ค์น๋ฅผ ๋ฎ์ท์.
genre_count
# Compute IDF for tag
total_movie_count = len(set(tags_df['movieId']))
# key: tag, value : numver of movies with such tag
tag_count_dict = dict.fromkeys(unique_tags)
for each_movie_tag_list in tags_df['tag']:
for tag in each_movie_tag_list.split(","):
if tag_count_dict[tag.strip()] == None:
tag_count_dict[tag.strip()] = 1
else:
tag_count_dict[tag.strip()] += 1
tag_idf = dict()
for each_tag in tag_count_dict:
tag_idf[each_tag] = np.log10(total_movie_count / tag_count_dict[each_tag])
# ๋ง์ด ๋์จ tag์ ๊ฐ์ค์น๋ฅผ ๋ ์ฃผ๊ธฐ ์ํจ. / tag_count_dict[each_tag]
tag_idf
๋ด์ผ์ ์ํ ๋ค์ง
๋ด์ผ์ ์ข ์ด๋ ค์ธ ๊ฒ ๊ฐ๋ค. ใ
ใ
ํ๋๋ง ๋ฃ๊ณ ์ ์ ๋ฆฌํด๋์
https://bit.ly/3L3avNW
๋ณธ ํฌ์คํ ์ ํจ์คํธ์บ ํผ์ค ํ๊ธ ์ฑ๋ฆฐ์ง ์ฐธ์ฌ๋ฅผ ์ํด ์์ฑ๋์์ต๋๋ค.