๐ซ์ ์ฃผ๋ ๊ด๊ด์ง ์ถ์ฒ ๋ชจ๋ธ ๊ฐ๋ฐ
์ด๋ฏธ์ง์ ํ ์คํธ ๋ถ์
์นดํ
๊ณ ๋ฆฌ : Portfolio Hashtag : #ํ๊ทธ
Introduction
- ์ ์ฃผ๋ ๊ด๊ด์ง ์ถ์ฒ ๋ชจ๋ธ์ ์ฌํ์ง๋ฅผ ์ฝ๊ฒ ์ ์ ํ๊ธฐ์ํ ๋ชจ๋ธ์ ๋๋ค.
- ์ด๋ฏธ์ง, ์์ฐ์ด(์นดํ ๊ณ ๋ฆฌ, ํค์๋ ๋ฑ)์ ์ด์ฉํด ์ ์ฌ๋๋ฅผ ๊ณ์ฐํ๊ณ ์ฌํ์ง๋ฅผ ์ถ์ฒํ๋ ์์คํ ์ ๊ตฌํํ์์ต๋๋ค.
- ๊ตฌํ ๊ฒฐ๊ณผ(์ผ์ชฝ : ๋ค๋น๊ฒ์ด์ API ์ต์ ๊ฒฝ๋ก | ์ค๋ฅธ์ชฝ : ์ง์ ๊ฑฐ๋ฆฌ ์ต์ ๊ฒฝ๋ก)
Contents
- 1. ํ๋ก์ ํธ ์๊ฐ
- 2. ๋ฐ์ดํฐ ์์ง ๋ฐ ์ ์ฒ๋ฆฌ
- 3. ๋ชจ๋ธ๋ง
- 4. ์ต์ข ์์คํ
- 5. ํ๊ณ ๋ฐ ๋ณด์์
- 6. ์ฐธ๊ณ ์๋ฃ
- 7. ๊ธฐํ ์ฌํญ
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 : ์ฅ์ ์ขํ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ฌ์ฉ -> ๊ฒฝ๋ก ์ถ์ฒ ```python
ํค๋
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={๊ฒฝ๋,์๋|โฆ}โ
GET์ ์ด์ฉํ์ฌ ํ๋
res1 = requests.get(url1, headers=headers)
Json์ ์ด์ฉํ์ฌ ํด์
doc1 = json.loads(res1.text)
res2 = requests.get(url2, headers=headers) doc2 = json.loads(res2.text) ```
- ๊ฒฝ๋ก ์ฑ๊ณตํ๋ ๊ฒฝ์ฐ
- Folium์ ์ฌ์ฉํ์ฌ ๊ฒฝ๋ก ์๊ฐํ
- Folium์ ์ฌ์ฉํ์ฌ ๊ฒฝ๋ก ์๊ฐํ
- ๊ฒฝ๋ก ์ฐพ๊ธฐ ์คํจํ๋ ๊ฒฝ์ฐ
- ๊ฒฝ๋ก ํ์์ด ์คํจํ๋ ๊ฒฝ์ฐ๋ฅผ ์ํด ์ง์ ๊ฑฐ๋ฆฌ ๊ฒฝ๋ก๋ ์ถ์ฒ
4. ์ต์ข ์์คํ
- ๊ตฌํ ์กฐ๊ฑด
- ์ถ๋ฐ ์ง์ : ์ ์ฃผ ๊ณตํญ
- ์ฅ์ ์ ํ : ์ด์ ์ฅ์ 15KM๋ด์ ์๋ ์ฅ์ ์ค ์ ํ(์๋์ ๊ฒฝ๋๋ฅผ ์ฌ์ฉํ ์ง์ ๊ฑฐ๋ฆฌ ์ฌ์ฉ)
- ๊ด๊ด๋ช ์ : ์ด๋ฏธ์ง ์ ์ฌ๋, ์์ฐ์ด ์ ์ฌ๋, ํ์ ํ์ฉ
- ์์์ : CLIP ๋ผ๋ฒจ๋ง, ์์ฐ์ด ์ ์ฌ๋, ํ์ ํ์ฉ
- ์นดํ : ์์ฐ์ด ์ ์ฌ๋, ํ์ ํ์ฉ
์์คํ ๋์ ์์
1) ํค์๋ ์ ํ
2) ์นดํ ๊ณ ๋ฆฌ ์ ํ
3) ๋ํ ์ฅ์ ์ ํ(์นดํ์ผ ๊ฒฝ์ฐ ์คํX)
4) ๊ด๊ด์ง ์ถ์ฒ
- ๋ํ ์ฅ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ด๊ด์ง ์ถ์ฒ ์งํ
- ์นดํ
๊ณ ๋ฆฌ, ๋ํ ์ฅ์ ์ ํ ๋ฐ๋ณต
- ์ข
๋ฃ : ์นดํ
๊ณ ๋ฆฌ ์ ํ์ 0 ์
๋ ฅ
5) ๊ฒฝ๋ก ํ์
- ์ข
๋ฃ : ์นดํ
๊ณ ๋ฆฌ ์ ํ์ 0 ์
๋ ฅ
- ์นด์นด์ค๋ด๋น API ํ์ฉ ๊ฒฝ๋ก ํ์
- ์ง์ ๊ฑฐ๋ฆฌ ๊ธฐ์ค ๊ฒฝ๋ก ํ์
6) ๊ฒฝ๋ก ์ถ๋ ฅ
- ํ์ํ ๊ฒฝ๋ก ๊ฒฐ๊ณผ๋ฅผ folium์ผ๋ก ์๊ฐํ
- ๊ด๊ด์ง ์ฃผ๋ณ 3KM ์ด๋ด์ ์๋ฐ ์ ์ ํ์
- ์นด์นด์ค๋ด๋น API ๊ฒฝ๋ก
- ์ง์ ๊ฑฐ๋ฆฌ ๊ธฐ์ค ๊ฒฝ๋ก
5. ํ๊ณ ๋ฐ ๋ณด์์
๐ ์ฌ์ฉ ๋ฐ์ดํฐ ๋ถ์กฑ
- ์ถ์ฒ์ ์ฌ์ฉํ ์ฃผ์ ๋ฐ์ดํฐ๋ ์ด๋ฏธ์ง, ์์ฐ์ด, ํ์ 3๊ฐ์ง์ด๋ค.
- ์ด๋ฏธ์ง
- ์์์ ๊ณผ ์นดํ์ ์ด๋ฏธ์ง๋ ์์, ์๋ฃ ๋ฑ์ผ๋ก ํน์ง ๋ฒกํฐ๋ก ๋ถ๋ฅํ๊ธฐ ์๋ง์ง์๋ค.
- ์์์ ์ ๊ฒฝ์ฐ CLIP์ ํ์ฉํด ๋ผ๋ฒจ๋ง์ ์งํํ์์ง๋ง, ์นดํ๋ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ์์ ์ ์งํํ์ง ๋ชปํ์๋ค.
- ์์ฐ์ด
- ์์ฐ์ด ๋ง๋ญ์น๋ฅผ keyword์ category_group_name 2๊ฐ์ง๋ฅผ ์กฐํฉํ์ฌ ๊ตฌ์ฑํ์๋ค.
- ๊ฐ ์ฅ์์ keyword๋ ๋๋ถ๋ถ 1๊ฐ์ด๋ฉฐ, ์ต๋ 3๊ฐ๋ก ๊ตฌ์ฑ๋์ด ์กฐํฉ์ด ๊ฐ๋จํ๋ค.
- ๊ฐ๋จํ ์กฐํฉ์ด๊ธฐ ๋๋ฌธ์ ์ฝ์ฌ์ธ ์ ์ฌ๋๊ฐ ๋น์ทํ ๊ฒฝ์ฐ๊ฐ ๋ง์ด ์กด์ฌํ๋ค.
- ํ์
- ์ฅ์๋ณ ํ์ด์ง(place_url)์์ ํ์ ์ ๊ทธ๋๋ก ์ถ์ถํ์ฌ ์ฌ์ฉํ๋ค.
- 1๋ช ์ด ํ๊ฐํ 5์ ๊ณผ 100๋ช ์ด ํ๊ฐํ 5์ ์ด ๋๊ฐ์ ํ์ ์ผ๋ก ์ธ์๋๋ค.
- ์ด๋ฏธ์ง
- ํ๋ํ ๋ฐ์ดํฐ์์ ์ฌ๋ฌ ์ ํ์ ์ด ๋ฐ๊ฒฌ๋์ด ์ถ์ฒ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๋จํ ํ์์ผ๋ก๋ง ๊ตฌ์ฑํ ์ ์์์ต๋๋ค.
- ํ์ ๋ฟ์๋๋ผ ์ฌ๋๋ค์ ๋ฆฌ๋ทฐ๋ฅผ ํ์ฉํ๋ฉด ์กฐ๊ธ ๋ ๋ณด์ํ ์ ์์ ๊ฒ์ด๋ผ ์๊ฐ๋๋ค.
๐ ๊ฒฐ๊ณผ์ ํ๊ฐ์งํ ๋ถ์ฌ
- ๋ผ๋ฒจ์ด ์กด์ฌํ๋ ์ง๋ ํ์ต์ด ์๋๊ธฐ ๋๋ฌธ์ ์ถ์ฒ ๊ฒฐ๊ณผ์ ๋ํ ํ๊ฐ์งํ๊ฐ ์๋ค.
6. ์ฐธ๊ณ ์๋ฃ
- ์นด์นด์ค ํค์๋ ๊ฒ์ API : https://developers.kakao.com/docs/latest/ko/local/dev-guide
- ์นด์นด์ค๋ด๋น API : https://developers.kakao.com/docs/latest/ko/kakaonavi/common
- ์ด๋ฏธ์ง ํน์ง ์ถ์ถ : https://blog.naver.com/PostView.nhn?blogId=syg7949&logNo=221883713196&categoryNo=27&parentCategoryNo=27&from=thumbnailList
- CLIP Doc : https://openai.com/blog/clip/
- CLIP Git : https://github.com/openai/CLIP