Introduction
- ์ ์ฃผ๋ ๊ด๊ด์ง ์ถ์ฒ ๋ชจ๋ธ์ ์ฌํ์ง๋ฅผ ์ฝ๊ฒ ์ ์ ํ๊ธฐ์ํ ๋ชจ๋ธ์
๋๋ค.
- ์ด๋ฏธ์ง, ์์ฐ์ด(์นดํ
๊ณ ๋ฆฌ, ํค์๋ ๋ฑ)์ ์ด์ฉํด ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ๊ณ ์ฌํ์ง๋ฅผ ์ถ์ฒํ๋ ์์คํ
์ ๊ตฌํํ์์ต๋๋ค.
- ๊ตฌํ ๊ฒฐ๊ณผ(์ผ์ชฝ : ๋ค๋น๊ฒ์ด์
API ์ต์ ๊ฒฝ๋ก | ์ค๋ฅธ์ชฝ : ์ง์ ๊ฑฐ๋ฆฌ ์ต์ ๊ฒฝ๋ก)

Contents
1. ํ๋ก์ ํธ ์๊ฐ
๋ฐฐ๊ฒฝ
- ๊ฐ๊ณ ์ถ์ ์ฅ์๋ ๋ง์ง๋ง ์ผ์ผ์ด ์ฅ์๋ฅผ ํ์ธํ๋ฉฐ ์ ์ ํ๊ธฐ ์ด๋ ค์
- ์ฅ์๋ฅผ ์ ์ ํ๋๋ผ๋ ์์์ ๋ฐ๋ผ ์๊ฐ๊ณผ ๊ฑฐ๋ฆฌ๊ฐ ๋ฌ๋ผ์ ธ ์ต์ ์ ๊ฒฝ๋ก ์ ์ ์ด ์ด๋ ค์
- ์ฅ์์ ๊ฒฝ๋ก์ ๋ํ ์ถ์ฒ์ผ๋ก ํด๋น ๊ณผ์ ์ ์ด๋ ค์์ ์ค์ผ ์ ์์ ๊ฒ
ํ๋ก์ ํธ ๊ฐ์
- ๊ตฌ์ฑ์ธ์ : ๊น์คํ, ๊น๋จ๊ท
- ์ํ๊ธฐ๊ฐ : 1๋ฌ (2202๋
1์)
- ๋ชฉํ : ํค์๋์ ํ
๋ง ์ ์ ์ผ๋ก ๊ด๊ด์ง์ ๊ฒฝ๋ก ์ถ์ฒ
- ๋ฐ์ดํฐ : ์นด์นด์ค ํค์๋ ๊ฒ์ API, selenium ํ์ฉ
- ๋ํ ์ปฌ๋ผ : [id, place_name, keyword, category_group_name, x, y, base_url, rating, (image)]
- ๊ด๊ด์ง ๋ฐ์ดํฐ(3008๊ฐ)
- ์๋ฐ ๋ฐ์ดํฐ(3004๊ฐ)
๊ฐ๋ฐ ํ๊ฒฝ
- ์ธ์ด : Python
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ : Jupyter, Pandas, Numpy, Selenium, Scikit-Learn, Tensorflow
- ์๊ณ ๋ฆฌ์ฆ : VGG16, CLIP
2. ๋ฐ์ดํฐ ์์ง ๋ฐ ์ ์ฒ๋ฆฌ
๊ด๊ด์ง ๋ฐ์ดํฐ
โช๋ฐ์ดํฐ ์์ง
- ๊ฒ์ ํค์๋(9๊ฐ) : '๋ง์ง', '๋ถ์๊ธฐ ์ข์', 'ํ
๋งํํฌ', '์ค์
๋ทฐ', '๊ฐ์ฑ', '๊ฐ์กฑ์ฌํ', '์ฒดํ', 'ํด์', '๋ ํฌ์ธ ', '๊ฐ๋ณผ๋งํ ๊ณณ'
- ์นดํ
๊ณ ๋ฆฌ(4๊ฐ) : CT1(๋ฌธํ์์ค), AT4(๊ด๊ด๋ช
์), FD6(์์์ ), CE7(์นดํ)
- (์ ์ฃผ์, ์๊ทํฌ์) ๋ฒ์ ๋, ๋ฆฌ ๋ณ๋ก ๊ฒ์


โช๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
- id ์ค๋ณต๊ฐ ์ฒ๋ฆฌ

- ๋ฌธํ ์์ค์ ์๊ฐ ๋ค๋ฅธ ์นดํ
๊ณ ๋ฆฌ์ ๋นํด ํ์ ํ ์ ์ด ๋ฌธํ์์ค์ ๊ด๊ด๋ช
์๋ก ๋ณ๊ฒฝ
- ์ด๋ฏธ์ง๊ฐ ์๋ ๋ฐ์ดํฐ ์ ๊ฑฐ
- ์ด๋ฏธ์ง์ ์ฌ์ด์ฆ (224 X 224)๋ก ์กฐ์ : ImageNet ๊ธฐ๋ฐ์ ์ฌ์ ํ์ต ๋ชจ๋ธ ์ฌ์ฉ
=> ์ด ๋ฐ์ดํฐ : 3008๊ฐ
์๋ฐ ๋ฐ์ดํฐ
โช๋ฐ์ดํฐ ์์ง
- ๊ฒ์ ํค์๋(6๊ฐ) : 'ํธํ
', '๋ฆฌ์กฐํธ',' ์ฝ๋', '๊ฒ์คํธํ์ฐ์ค', '๋ฏผ๋ฐ', 'ํ์
'
- ์นดํ
๊ณ ๋ฆฌ(1๊ฐ) : AD5(์๋ฐ)
- (์ ์ฃผ์, ์๊ทํฌ์) ๋ฒ์ ๋, ๋ฆฌ ๋ณ๋ก ๊ฒ์


โช๋ฐ์ดํฐ ์ ์ฒ๋ฆฌ
- id ์ค๋ณต๊ฐ ์ฒ๋ฆฌ

- ์๊ฐ ์๋์ ์ผ๋ก ์ ์ ๋ฆฌ์กฐํธ์ ์ฝ๋๋ฅผ ๋ฆฌ์กฐํธ/์ฝ๋๋ก ๋ณํฉ
- ์ด๋ฏธ์ง๊ฐ ์๋ ๋ฐ์ดํฐ ์ ๊ฑฐ
=> ์ด ๋ฐ์ดํฐ : 3004๊ฐ
3. ๋ชจ๋ธ๋ง
์ด๋ฏธ์ง ํน์ง ์ถ์ถ ๋ฐ ์ ์ฌ๋ ์ธก์
-
VGG16 ๋ชจ๋ธ์ ํ์ฉํด ํน์ง ์ถ์ถ(Feature Extraction) :
- ์ฒซ ๋ฒ์งธ FC Layer ์ถ์ถ : (1, 4096) ํํ์ ํน์ง ๋ฒกํฐ ํ๋

-
์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ

-
์ฝ์ฌ์ธ ์ ์ฌ๋

-
์ ํด๋ฆฌ๋ ๊ฑฐ๋ฆฌ์ ์ฝ์ฌ์ธ ์ ์ฌ๋์ ์ฐจ์ด๊ฐ ๋ณด์ด์ง ์์ ์ต์ข
์ ์ผ๋ก ์ฝ์ฌ์ธ ์ ์ฌ๋
์ฌ์ฉ
-
์์์ ๊ณผ ์นดํ๋ ํน์ง ์ถ์ถ๋ก๋ ํํ์ด ์๋์ง ์์ ๊ด๊ด ๋ช
์๋ง ์งํ
์์ ๋ผ๋ฒจ๋ง
- CLIP : ์ด๋ฏธ์ง์ ํ
์คํธ ์์ ์์ธกํ๋๋ก ํ์ต๋๋ ๋ชจ๋ธ

- ์์ ์นดํ
๊ณ ๋ฆฌ ์ ์ (32๊ฐ)
- CLIP์ ํ์ฉํ๊ธฐ ์ํด ์์ด๋ก ์์ฑ
- ["chicken", "Grilled pork","chiness food","sea food","noodle","Grilled fish", "Grilled Cutlassfish","beef","Hanjeongsik", "sashimi","bolied pork","hamburger","shrimp sashimi","shrimp","melon prosciutto","pork cutlet", "bread","pizza","Waffle","Tteokbokki","pasta","ramen","sushi","corn dog","American breakfast","crab","curry","bread","soup","tuna", "doughnut","koreanstyle sushi(gimbab)"]
- ์์ ์ด๋ฏธ์ง์ ์์ ์นดํ
๊ณ ๋ฆฌ๋ก ๋ผ๋ฒจ๋ง ์งํ
- ๊ฐ์ฅ ๋์ ์์ธก์ ๋ณด์ฌ์ฃผ๋ ๋ผ๋ฒจ๋ง์ ์์์ ์นดํ
๊ณ ๋ฆฌ๋ก ์ ์

ํ
๋ง ์์ฐ์ด ์ ์ฌ๋
- content : keyword์ category_group_name๋ฅผ ํ์ฉํ ๋ง๋ญ์น
- ํค์๋ : '๋ง์ง', '๋ถ์๊ธฐ ์ข์', 'ํ
๋งํํฌ', '์ค์
๋ทฐ', '๊ฐ์ฑ', '๊ฐ์กฑ์ฌํ', '์ฒดํ', 'ํด์', '๋ ํฌ์ธ ', '๊ฐ๋ณผ๋งํ ๊ณณ'
- ์นดํ
๊ณ ๋ฆฌ : '๊ด๊ด๋ช
์', '์์์ ', '์นดํ'
- CountVectorizer๋ฅผ ํตํด ๋ฒกํฐํ

- Cosine Similarity
- ์ฝ์ฌ์ธ ์ ์ฌ๋ matrix

- ์ฝ์ฌ์ธ ์ ์ฌ๋ ์ ์ฉ ์์

๊ฒฝ๋ก ์ถ์ฒ
- ์นด์นด์ค๋ด๋น API : ์ฅ์ ์ขํ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ฌ์ฉ -> ๊ฒฝ๋ก ์ถ์ฒ
headers = {"Authorization" : "KakaoAK {}".format(rest_api_key)}
url1 = "https://apis-navi.kakaomobility.com/v1/directions?origin={๊ฒฝ๋1},{์๋1}&destination={๊ฒฝ๋2},{์๋2}&waypoints={๊ฒฝ๋,์๋|...}"
url2 = "https://apis-navi.kakaomobility.com/v1/directions?origin={๊ฒฝ๋3},{์๋3}&destination={๊ฒฝ๋4},{์๋4}&waypoints={๊ฒฝ๋,์๋|...}"
res1 = requests.get(url1, headers=headers)
doc1 = json.loads(res1.text)
res2 = requests.get(url2, headers=headers)
doc2 = json.loads(res2.text)
- ๊ฒฝ๋ก ์ฑ๊ณตํ๋ ๊ฒฝ์ฐ

- Folium์ ์ฌ์ฉํ์ฌ ๊ฒฝ๋ก ์๊ฐํ

- ๊ฒฝ๋ก ์ฐพ๊ธฐ ์คํจํ๋ ๊ฒฝ์ฐ

- ๊ฒฝ๋ก ํ์์ด ์คํจํ๋ ๊ฒฝ์ฐ๋ฅผ ์ํด ์ง์ ๊ฑฐ๋ฆฌ ๊ฒฝ๋ก๋ ์ถ์ฒ
4. ์ต์ข
์์คํ

- ๊ตฌํ ์กฐ๊ฑด
- ์ถ๋ฐ ์ง์ : ์ ์ฃผ ๊ณตํญ
- ์ฅ์ ์ ํ : ์ด์ ์ฅ์ 15KM๋ด์ ์๋ ์ฅ์ ์ค ์ ํ(์๋์ ๊ฒฝ๋๋ฅผ ์ฌ์ฉํ ์ง์ ๊ฑฐ๋ฆฌ ์ฌ์ฉ)
- ๊ด๊ด๋ช
์ : ์ด๋ฏธ์ง ์ ์ฌ๋, ์์ฐ์ด ์ ์ฌ๋, ํ์ ํ์ฉ
- ์์์ : CLIP ๋ผ๋ฒจ๋ง, ์์ฐ์ด ์ ์ฌ๋, ํ์ ํ์ฉ
- ์นดํ : ์์ฐ์ด ์ ์ฌ๋, ํ์ ํ์ฉ
์์คํ
๋์ ์์
1) ํค์๋ ์ ํ

2) ์นดํ
๊ณ ๋ฆฌ ์ ํ

3) ๋ํ ์ฅ์ ์ ํ(์นดํ์ผ ๊ฒฝ์ฐ ์คํX)


4) ๊ด๊ด์ง ์ถ์ฒ
- ๋ํ ์ฅ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ด๊ด์ง ์ถ์ฒ ์งํ
- ์นดํ
๊ณ ๋ฆฌ, ๋ํ ์ฅ์ ์ ํ ๋ฐ๋ณต
- ์ข
๋ฃ : ์นดํ
๊ณ ๋ฆฌ ์ ํ์ 0 ์
๋ ฅ
5) ๊ฒฝ๋ก ํ์
- ์นด์นด์ค๋ด๋น API ํ์ฉ ๊ฒฝ๋ก ํ์
- ์ง์ ๊ฑฐ๋ฆฌ ๊ธฐ์ค ๊ฒฝ๋ก ํ์
6) ๊ฒฝ๋ก ์ถ๋ ฅ
- ํ์ํ ๊ฒฝ๋ก ๊ฒฐ๊ณผ๋ฅผ folium์ผ๋ก ์๊ฐํ
- ๊ด๊ด์ง ์ฃผ๋ณ 3KM ์ด๋ด์ ์๋ฐ ์
์ ํ์
- ์นด์นด์ค๋ด๋น API ๊ฒฝ๋ก

- ์ง์ ๊ฑฐ๋ฆฌ ๊ธฐ์ค ๊ฒฝ๋ก

5. ํ๊ณ ๋ฐ ๋ณด์์
๐ ์ฌ์ฉ ๋ฐ์ดํฐ ๋ถ์กฑ
- ์ถ์ฒ์ ์ฌ์ฉํ ์ฃผ์ ๋ฐ์ดํฐ๋ ์ด๋ฏธ์ง, ์์ฐ์ด, ํ์ 3๊ฐ์ง์ด๋ค.
- ์ด๋ฏธ์ง
- ์์์ ๊ณผ ์นดํ์ ์ด๋ฏธ์ง๋ ์์, ์๋ฃ ๋ฑ์ผ๋ก ํน์ง ๋ฒกํฐ๋ก ๋ถ๋ฅํ๊ธฐ ์๋ง์ง์๋ค.
- ์์์ ์ ๊ฒฝ์ฐ CLIP์ ํ์ฉํด ๋ผ๋ฒจ๋ง์ ์งํํ์์ง๋ง, ์นดํ๋ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ์์
์ ์งํํ์ง ๋ชปํ์๋ค.
- ์์ฐ์ด
- ์์ฐ์ด ๋ง๋ญ์น๋ฅผ keyword์ category_group_name 2๊ฐ์ง๋ฅผ ์กฐํฉํ์ฌ ๊ตฌ์ฑํ์๋ค.
- ๊ฐ ์ฅ์์ keyword๋ ๋๋ถ๋ถ 1๊ฐ์ด๋ฉฐ, ์ต๋ 3๊ฐ๋ก ๊ตฌ์ฑ๋์ด ์กฐํฉ์ด ๊ฐ๋จํ๋ค.
- ๊ฐ๋จํ ์กฐํฉ์ด๊ธฐ ๋๋ฌธ์ ์ฝ์ฌ์ธ ์ ์ฌ๋๊ฐ ๋น์ทํ ๊ฒฝ์ฐ๊ฐ ๋ง์ด ์กด์ฌํ๋ค.
- ํ์
- ์ฅ์๋ณ ํ์ด์ง(place_url)์์ ํ์ ์ ๊ทธ๋๋ก ์ถ์ถํ์ฌ ์ฌ์ฉํ๋ค.
- 1๋ช
์ด ํ๊ฐํ 5์ ๊ณผ 100๋ช
์ด ํ๊ฐํ 5์ ์ด ๋๊ฐ์ ํ์ ์ผ๋ก ์ธ์๋๋ค.
- ํ๋ํ ๋ฐ์ดํฐ์์ ์ฌ๋ฌ ์ ํ์ ์ด ๋ฐ๊ฒฌ๋์ด ์ถ์ฒ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๋จํ ํ์์ผ๋ก๋ง ๊ตฌ์ฑํ ์ ์์์ต๋๋ค.
- ํ์ ๋ฟ์๋๋ผ ์ฌ๋๋ค์ ๋ฆฌ๋ทฐ๋ฅผ ํ์ฉํ๋ฉด ์กฐ๊ธ ๋ ๋ณด์ํ ์ ์์ ๊ฒ์ด๋ผ ์๊ฐ๋๋ค.
๐ ๊ฒฐ๊ณผ์ ํ๊ฐ์งํ ๋ถ์ฌ
- ๋ผ๋ฒจ์ด ์กด์ฌํ๋ ์ง๋ ํ์ต์ด ์๋๊ธฐ ๋๋ฌธ์ ์ถ์ฒ ๊ฒฐ๊ณผ์ ๋ํ ํ๊ฐ์งํ๊ฐ ์๋ค.
6. ์ฐธ๊ณ ์๋ฃ
7. ๊ตฌ์ฑ ์ธ์