s t u d y . . ๐Ÿง/์ด๊ฒƒ์ €๊ฒƒ

[์ถ”์ฒœ ์‹œ์Šคํ…œ] ๋ฉ”๋‰ด ์ถ”์ฒœ ์‹œ์Šคํ…œ (1)

H J 2023. 3. 28. 17:01

๋ฉ”๋‰ด๋ช…์„ ๋ฐ›์œผ๋ฉด ์นดํ…Œ๊ณ ๋ฆฌ ์œ ์‚ฌ๋„์— ๋”ฐ๋ผ ์Œ์‹์„ ์ถ”์ฒœํ•ด ์ฃผ๊ณ , ์‚ฌ์šฉ์ž์˜ ํ‰๊ฐ€๋ฅผ ๋ฐ›์•„ ์ถ”์ฒœ์— ๋ฐ˜์˜ํ•˜๋Š” ์ปจํ…์ธ ๊ธฐ๋ฐ˜ ์ถ”์ฒœ ์‹œ์Šคํ…œ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ด๋‹ค !!


์šฐ์„ ์€ ๊ณต๊ณต ๋ฐ์ดํ„ฐ ์ค‘ ํ•œ๊ตญ๊ตญ์ œ๊ต๋ฅ˜์žฌ๋‹จ_ํ•œ๊ตญ์Œ์‹์ •๋ณด_์˜๋ฌธ ๋ฐ์ดํ„ฐ์…‹์„ ์‚ฌ์šฉํ–ˆ๋‹ค

AI hub์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์…‹๋“ค์€ ์Œ์‹ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์…‹์ด๋ผ ์ด๋ฏธ์ง€๋ช…์—์„œ ์นดํ…Œ๊ณ ๋ฆฌ์™€ ์Œ์‹๋ช…์„ ๋ฝ‘์•„์™€์•ผ ํ•ด์„œ ํ…์ŠคํŠธ๋กœ ์ œ๊ณตํ•ด ์ฃผ๋Š” ๋ฐ์ดํ„ฐ์…‹์„ ์„ ํƒํ–ˆ๋‹ค

 

ํ•œ๊ตญ๊ตญ์ œ๊ต๋ฅ˜์žฌ๋‹จ_ํ•œ๊ตญ์Œ์‹์ •๋ณด_์˜๋ฌธ_20230228

ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” ์žฌ๋ฃŒ(๋ฉด, ๋–ก, ์ฑ„์†Œ๋ฅ˜, ์ “๊ฐˆ ๋“ฑ) ๋ฐ ์กฐ๋ฆฌ๋ฒ•(์ฐœ, ๊ตฌ์ด, ์กฐ๋ฆผ, ๋“ฑ) ๋ณ„๋กœ ๋ถ„๋ฅ˜ํ•œ ์•ฝ 700์—ฌ๊ฐ€์ง€์˜ ํ•œ๊ตญ์Œ์‹์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์˜๋ฌธ์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

www.data.go.kr

์•„๋ž˜๋Š” ๋…ธ์…˜์— ์ •๋ฆฌํ•ด ๋‘” ๋ฐ์ดํ„ฐ์…‹ ํ›„๋ณด๋“ค ๐Ÿ’ค


์ถ”์ฒœ ์‹œ์Šคํ…œ์„ ์ฒ˜์Œ ์ ‘ํ•ด๋ณด๋Š” ๊ฑฐ๋ผ ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ !

 

์šฐ์„  csv ํŒŒ์ผ์„ ์ฝ๊ธฐ ์œ„ํ•ด pandas๋ฅผ ์ž„ํฌํŠธ ํ•ด์ค€๋‹ค

import pandas as pd

df = pd.read_csv('food_list.csv',encoding='cp949') # csv ํŒŒ์ผ ์ฝ์–ด์˜ค๊ธฐ
data = df[['๊ตฌ๋ถ„', '์Œ์‹๋ช…']] # ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ ธ์˜ค๊ธฐ

ํ•œ๊ธ€์ด ๊นจ์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ธ์ฝ”๋”ฉ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค

 

๋‹ค์Œ์œผ๋กœ๋Š” ๋ฌธ์ž์—ด๋กœ ๋˜์–ด์žˆ๋Š” ์Œ์‹ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋ฒกํ„ฐํ™”ํ•ด์ค€๋‹ค

sklearn ๋ชจ๋“ˆ ์ž„ํฌํŠธ !

from sklearn.feature_extraction.text import CountVectorizer

cv = CountVectorizer(ngram_range=(1,1)) 
cv_category = cv.fit_transform(data['๊ตฌ๋ถ„'])
cv.vocabulary_ # ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ

CountVectorizer๋Š” ํ…์ŠคํŠธ์—์„œ ๋“ฑ์žฅ ํšŸ์ˆ˜๋ฅผ ์นด์šดํŒ… ํ•˜์—ฌ ๋ฒกํ„ฐํ™”ํ•ด ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค

๋‹จ์ˆœํžˆ ์นด์šดํŠธ๋งŒ์„ ํ•ด์ฃผ์–ด์„œ ๋นˆ๋„์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ค‘์š”ํ•œ ๋‹จ์–ด๋“ค์„ ๋ฝ‘์•„์ฃผ๋Š” TF-IDF๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๋Š”๋ฐ, ๋‚˜๋Š” ๋ฌธ์žฅ์„ ๋ถ„์„ํ•ด์„œ ๋ฒกํ„ฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ์„œ CountVectorizer๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค (CountVectorizer๋Š” ์กฐ์‚ฌ๋‚˜ ๊ด€์‚ฌ๋ฅผ ์ค‘์š”ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค๊ณ  ํ•จ)

 

์—ฌ๊ธฐ์„œ ngram_range๋Š” ๋‹จ์–ด ๋ฌถ์Œ์˜ ๋ฒ”์œ„๋ฅผ ์„ค์ •ํ•ด์ค€๋‹ค

๋‚˜๋Š” (1, 1)๋กœ ์„ค์ •ํ•ด ์ฃผ์—ˆ๋Š”๋ฐ, ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋„์–ด์“ฐ๊ธฐ ์—†์ด ํ•œ ๋‹จ์–ด๋ฌถ์Œ์œผ๋กœ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— 1๊ฐœ์˜ ๋‹จ์–ด๋ฌถ์Œ ~ 1๊ฐœ์˜ ๋‹จ์–ด๋ฌถ์Œ์œผ๋กœ ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค

 

CountVectorizer๋กœ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๊ณ  fit_transform์„ ํ†ตํ•ด ๋ณ€ํ™˜์‹œ์ผœ์ค€๋‹ค

 

vocabulary_์—๋Š” ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์ธ๋ฑ์Šค ๋ฒˆํ˜ธ๊ฐ€ ์ €์žฅ๋œ๋‹ค

 

 

๋‹ค์Œ์œผ๋กœ๋Š” ๋ฒกํ„ฐํ™”๋œ ์นดํ…Œ๊ณ ๋ฆฌ์˜ ์œ ์‚ฌ๋„๋ฅผ ๊ณ„์‚ฐํ•ด์ค€๋‹ค

๋‚˜๋Š” ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค

from sklearn.metrics.pairwise import cosine_similarity
similarity_category = cosine_similarity(cv_category, cv_category).argsort()[:,::-1]
print(similarity_category)
similarity_category.shape

์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„๋ฅผ ๊ตฌํ•˜๊ณ  argsort๋กœ ์œ ์‚ฌ๋„๊ฐ€ ๋†’์€ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•ด์ฃผ์—ˆ๋‹ค

 

 

๋‹ค์Œ์œผ๋กœ! ๋ฉ”๋‰ด๋ช…์„ ์ž…๋ ฅํ•˜๋ฉด ๋น„์Šทํ•œ ์นดํ…Œ๊ณ ๋ฆฌ์˜ ์Œ์‹์„ ์ถ”์ฒœํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ๋‹ค

def recommend_menu(df, menu_name, top=10):
	target_menu_idx = df[df['์Œ์‹๋ช…'] == menu_name].index.values

	sim_idx = similarity_category[target_menu_idx, :top].reshape(-1)
	sim_idx = sim_idx[sim_idx != target_menu_idx]

	result = df.iloc[sim_idx]
	return result

์ž…๋ ฅ๋œ ์Œ์‹๋ช…๊ณผ ๋น„์Šทํ•œ ๋ฉ”๋‰ด๋ฅผ ๋ฝ‘๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ์Œ์‹๋ช…์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค

 

์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„๊ฐ€ ๋น„์Šทํ•œ ๊ฒƒ๋“ค์„ ๊ฐ€์ ธ์˜ค๊ณ 

์ž๊ธฐ ์ž์‹ ๊ณผ๋Š” ์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„๊ฐ€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ์ œ์™ธํ•ด์ค€๋‹ค

 

data frame์œผ๋กœ ๋งŒ๋“ค๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค

 

 

๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ด ๋ด…์‹œ๋‹ค~

recommend_menu(data, menu_name='์ž…๋ ฅํ•˜๊ณ  ์‹ถ์€ ๋ฉ”๋‰ด๋ช…')

๋”ฐ๋ž€ ~

 

์–ด๋–ค ๋ฉ”๋‰ด๋Š” ๊ตฌ๋ถ„๋Œ€๋กœ ์—„์ฒญ ์ž˜ ๋‚˜์˜ค๊ณ  ์–ด๋–ค ๋ฉ”๋‰ด๋Š” ์”.. ๋” ๊ณต๋ถ€ํ•ด๋ด์•ผ๊ฒ ๋‹ค!! ๐Ÿˆ‍โฌ›๐Ÿง