무신사로 진행한다
원하는 구현 방식
행은 옷들
컬럼은 ID, 옷링크, 옷종류(티,레깅스 등등등), 옷컬러
입력: 사용자가 고른옷 ID(index)
출력: 옷종류, 옷색깔, 링크, 사진까지...?
무신사데이터를 활용해서 코디 완성해주는 AI개발
웹페이지에서 서비스까지 stream it이용
raw데이터 다양한 정보 제조사, 색깔, 옷이름, 가격, ID
크롤링으로 받는 input데이터는
옷종류, 색깔만남김
word2vec을 이용하여 내가 고른 흰색옷과 관련성이 높은 옷세트 구성
잘은 모르지만 이런식으로 가면 좋을듯
흰티를고름->흰티와 관련성이 높은검은바지추천->흰티와 검은바지와 동시에 관련성이 높은 샌달 추천-> ....
여기서 조건은
관련성이 가장 높은것을(1등) 추천함과 동시에 1등의 관련성도 어느정도 높아야 한다는점이다
그렇지않으면 흰티 검은반바지 샌들에서 멈추지않고 계속 추천할것이다 그러니 절대값으로 관련도가 어느정도 높은걸 추천하는게 좋겠다
이렇게해서 추천된옷의 종류와 색깔중에 평점수 일정수준이상의 가장 높은 평점의 옷을 추천해준다
추천은 이런식으로 하면 좋을것이다
흰티를 골랐을때 바지를 추천받고
그다음 옷은 흰티와의 거리+바지와의 거리가 가장 짧은 옷을 추천받는다
그다음도 그다음도 계속 쭉쭉
아무리 1등이라도 어느정도 수준이상의 거리가 되면 더이상추천받지않고 조합을 완성한다
그냥 전체조합중에서 옷종류가 겹치지않는선에서 가장 뛰어난 조합찾기? 그것도 해보고싶은데 어려울것같다
강사님한테 물어봐야하나...
여기서 잠깐 추천시스템에대한 전반적인 기초지식이 없어 잠깐 쌓고 가자면
무신사에 코디를 저장해놓은 사이트가 있다
오호 코디칸이있다 내가 원하는 딱 그런데이터 다만 크롤링하기 빡세보인다
그리고 크롤링하고나서도 전처리는 필수
제대로만된다면 데이터 형식은 아마
인덱스는 옷 종류
신발, 하의, 상의(안쪽), , 상의(바깥쪽)
1 [센달(blue), 반바지(black), 셔츠(화려한무늬)]
2 요런식으로
3
4
5
6
7
8
9
인풋
(옷종류), (색깔)과 (옷종류), (색깔)에 어울리는 (옷종류)를 찾아줘
아웃풋
(색깔)의 (옷종류) 를 추천해드립니다
이제 크롤링을 해봅시다
문제점발견
상품명은 쉽게긁어올수 있더라도 옷종류와 컬러만 따로 볼수있는 방법이 없었다
해결방법
일단 상품명만 긁어온뒤
WHITE,화이트,흰색이 상품명에 있으면 흰색으로 분류하는식으로 하면될듯!
크롤링 한창 시도중 한 3시간만에 안되는 원인을 알아냈다
무신사가 크롤링을 막아둔것같다 그렇다면 셀레니움으로 시도해본다
크롤링에 익숙하지 않아서 이사실을 깨닫는데도 3시간정도 걸린것같다
이런식으로 뜨는데 아무래도 막아둔게 분명하다
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
</body>
</html>
뷰티풀숲이 안되는걸 확인했다
따라서 셀레니움으로 해보기로했다
셀레니움으로는 웬만한거 다뚫린다는 강사님의 말이 생각났다 과연?
셀레니움은 한번도 안써봤다 그러니 아마 시행착오가 굉장히 많을것으로 예상되었다
이제 웬만한 실패에는 멘탈이 단련되었다(코딩4개월차)
플랫폼을 코랩에서 vs코드로 옮겼다 드라이버 설치가 코랩에선 잘안되는것같아서
원래 친코드
element=driver.find_elements_by_css_selector(".brand_item")
작동이 잘안되는것같다 찾아보니 셀레니움 문법이 바뀌었다고 카더라...
element=driver.find_element(By.CSS_SELECTOR, '.brand_item')
그래서 이걸로 바꿔봄 근데 자꾸 By부분이 틀렸다고 찍그어져있는데
다들 저게 맞다고 해서 도대체 어케해야될지 미치고팔짝뛸 노릇이었다
그렇게 셀레니움설치도 지웠다 다시깔았다 반복하고 한결과 해결책은 단순했다
from selenium.webdriver.common.by import By
그냥 이거 치면된다 끝
남은 오류는 하나
ERROR:device_event_log_impl.cc(214)] [03:18:13.091] Bluetooth: bluetooth_adapter_winrt.cc:1074 Getting Default Adapter failed.
이건또 뭘까..
출처: https://sulung-sulung.tistory.com/41
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(options=options)
위코드를 넣는것으로 해결하였다
TypeError: 'WebElement' object is not iterable
이번엔 또 에러나길래
find_element를 find_elements로 바꾸니 해결되었다
아~~ 그리고 오류 없이 잘 실행되는 모습을 확인했다 지금 너무 배고프고 피곤하다 내일마무리할수있을것같다
자고일어났다 코드구현 완성
중간에 tqdm관련 오류가 있었지만 해결하였다 이제 아래의 코드를 실행시켜놓고 밥먹고 오면될것같다
코디맵에 있는 모든 옷 정보를 가져온다 옷정보가 없으면 스킵한다 조금 돌려봤는데 잘되는것같다
밥먹고 와야지~ 근데 잠깐 어차피 브레이크 타임이군
.py로 실행시켰는데 무신사변수를 쓰려면 다시 돌려야되는거아닌가? 라는생각이듬
혹시나 같은 폴더에서는 변수가 공유되나 싶어서 실험해봣는데 안됨
파이참에서는 누가 된다고 했었던것같긴한데... 쨋든
주피터 노트북으로 돌려보았더니 리스트 길이가 초과되었다고 중간에 에러뜸
그래서 결과를 csv파일로 저장해놓기로함
근데 이게 옷추천이라는게 추천하는 물품 개수가 항상 같지않다
어쩔때는 신발, 바지, 상의, 자켓, 악세사리, 모자, 벨트까지 풀셋으로 추천하는데
어쩔때는 그냥 신발이랑 셔츠만 추천할때도있다
중간에 잠시 확인하러 왔는데 말그대로 unknown에러가 났다고 써있다
그리고 텍스트 파일로 저장도 안되어있길래 조금씩 페이지를 분할해서 실행시켜야할것같다
크롤링은 진행중 위의 이유때문에 한번에 안하고 700개씩 분할해서 하던중이었는데 또 언노운 에러발생
selenium.common.exceptions.WebDriverException: Message: unknown error: unexpected command response
time 간격을 랜덤하면 중간에 끊기는걸 피할수있을까?
a = np.random.randint(5)
time.sleep(a
근데 이렇게 해도 문제나길래 구글검색해보니
다른 해결책을 제시해 주었다
pip install webdriver_manager.chorome 을 하고
from webdriver_manager.chrome import ChromeDriverManager
모듈을 임포트했더니 아까처럼 에러가 나진 않았다
근데 곧 에러가 났다 크롬버전과 드라이브 버전은 모두 낮추거나 아니면 엣지드라이버를 이용하라고한다 일단 귀찮으니 보류 한번 더 돌려본다
결국 또 에러가 났고
결국 엣지드라이버를 받고 엣지브라우저로 실행 남은거 한번에 돌려본다 제발 자고있을동안 전부 실행되어있길
driver = webdriver.Edge()
엣지드라이버로 바꿔하니 실행중 에러가 나지않았다
전처리중 한글과 영어가 섞인건괜찮은데 영어는 대소문자까지 신경써야되서 너무짜증났다
그래서 생각을좀해보다가 전처리로 .lower()을써서 다 소문자로 만들기로했다 한글과 섞여있는 텍스트에 사용해도
적용되는것을 확인했다
원래 하의,상의,신발, 아우터,모자, 한벌옷까지 옷 부위대로 분류하려고했다
근데 생각보다 옷의 종류가 많았고 노가다에 지쳐서 상의, 하의, 아우터만하는것으로 합의를 보았다
저의 계획은 상품명에서 색깔정보, 옷종류 정보를 뽑아낸뒤 옷 추천 모델을 만드는것입니다
무신사 코디맵 크롤링 코드
import pandas as pd
import numpy as np
# 라이브러리 import
# 라이브러리 : 필요한 도구
import selenium
from selenium import webdriver # 라이브러리(모듈) 가져오라
from selenium.webdriver import ActionChains as AC
import tqdm
from tqdm.autonotebook import tqdm
import re
import time
from time import sleep
from webdriver_manager.chrome import ChromeDriverManager
# 워닝 무시
import warnings
warnings.filterwarnings('ignore')
from selenium.webdriver.common.by import By
# 엣지
driver = webdriver.Edge()
musinsa=[]
# 17795+1
for i in tqdm(range(1,17795+1)):
driver.get(f'https://www.musinsa.com/app/codimap/views/{i}?style_type=&tag_no=&brand=&display_cnt=60&list_kind=big&sort=date&page=')
cloth_list=[]
time.sleep(1)
# a = np.random.randint(5)
# time.sleep(a)
try:
element=driver.find_elements(By.CSS_SELECTOR, '.brand_item')
for j in element:
cloth_list.append(j.text)
musinsa.append(cloth_list)
except:
continue
# print(musinsa)
with open('test.txt','w',encoding='UTF-8') as f:
for name in musinsa:
f.write('@'.join(name)+'\n')
전처리 함수
def whats_your_color(x):
if 'white' in x or '화이트' in x or 'WHITE' in x or '크림' in x or 'CREAM' in x or 'cream' in x or 'Cream' in x or 'Snow' in x or 'white' in x or '흰색' in x:
return '흰색'
if '베이지' in x or '아이보리' in x or 'IVORY' in x or 'BEIGE' in x or 'ivory' in x or 'Ivory' in x:
return '베이지색'
if '검정' in x or '블랙' in x or 'Black' in x or 'BLACK' in x or 'Ink' in x or 'black' in x:
return '검정'
if '회색' in x or '그레이' in x or 'GREY' in x or 'Grey' in x or '실버' in x or 'grey' in x or '애쉬' in x or 'gray' in x or '그래이' in x:
return '회색'
if '남색' in x or '인디고' in x or '네이비' in x or 'NAVY' in x or 'Navy' in x or 'navy' in x or 'Indigo' in x:
return '남색'
if '카키' in x or 'khaki' in x or 'KHAKI' in x:
return '카키색'
if '갈색' in x or '브라운' in x or 'BROWN' in x or 'brown' in x or '카멜' in x or '코코아' in x:
return '갈색'
if '초록' in x or '그린' in x or '올리브' in x or 'green' in x or 'olive' in x or 'Green' in x or '모스' in x:
return '초록색'
if '파랑' in x or '파란' in x or '블루' in x or 'Blue' in x or 'BLUE' in x or 'sky' in x or 'blue' in x:
return '파란색'
if '핑크' in x or 'pink' in x or '로즈' in x:
return '핑크색'
if '빨강' in x or 'RED' in x or '레드' in x or 'Red' in x or 'red' in x:
return '빨간색'
if '보라' in x or 'purple' in x:
return '보라색'
if '옐로우' in x or 'yellow' in x:
return '노란색'
if '오렌지' in x or 'orange' in x:
return '주황색'
if '민트' in x or 'mint' in x or 'Mint' in x or 'mint' in x:
return '민트색'
if '오트밀' in x or 'oatmeal' in x:
return '오트밀색'
def what_kind_of_clothes(x):
# 하의 시작
if '청바지' in x or 'JEAN' in x or 'jean' in x or '데님' in x or 'DENIM' in x or 'denim' in x or 'Denim' in x :
return '데님 팬츠'
elif '슬랙스' in x or 'slacks' in x or 'SLACKS' in x or 'Slacks' in x or 'cotton pants' in x or 'cotton pant' in x or 'Trouser' in x or 'trouser' in x or 'TROUSER' in x:
return '슬랙스'
elif '린넨' in x or 'LINEN' in x or 'Linen' in x or 'linen' in x:
return '린넨 팬츠'
elif '카고 팬츠' in x or '카고팬츠' in x or 'CARGO Pant' in x or 'Cargo Pants' in x:
return '카고 팬츠'
elif '퍼티그팬츠' in x or '퍼티그 팬츠' in x or 'fatigue pant' in x:
return '퍼티그 팬츠'
elif '조거팬츠' in x or '조거 팬츠' in x or 'jogger pant'in x:
return '조거 팬츠'
elif '코듀로이 팬츠' in x or 'corduroy pant' in x or '코듀로이팬츠' in x:
return '코듀로이 팬츠'
elif '치노' in x or 'chino pant' in x:
return '치노 팬츠'
elif '스웨트 팬츠' in x or '스웨트팬츠' in x or 'sweat pant'in x:
return '스웨트 팬츠'
elif '스웨트 쇼츠' in x or '스웨트쇼츠' in x or 'sweat shorts' in x:
return '스웨트 쇼츠'
elif 'shorts' in x or '쇼츠' in x:
return '쇼츠'
elif '반바지' in x or '반 바지' in x:
return '반바지'
elif '버뮤다 팬츠' in x or '버뮤다팬츠' in x or 'bermuda' in x:
return '버뮤다 팬츠'
elif '데님스커트' in x or '데님 스커트' in x or 'denim skirt' in x:
return '데님 스커트'
elif '미디스커트' in x or '미디 스커트' in x or 'midi skirt' in x:
return '미디 스커트'
elif '미니스커트' in x or '미니 스커트' in x or 'mini skirt' in x:
return '미니 스커트'
elif '플리츠스커트' in x or '플리츠 스커트' in x or 'pleats skirt' in x:
return '플리츠 스커트'
elif '플레어스커트' in x or '플레어 스커트' in x or 'flare skirt' in x:
return '플레어 스커트'
elif '롱 스커트' in x or '롱스커트' in x or 'long skirt' in x:
return '롱 스커트'
elif '랩 스커트' in x or '랩스커트' in x or 'wrap skirt' in x:
return '랩 스커트'
elif '롱 스커트' in x or '롱스커트' in x or 'long skirt' in x:
return '롱 스커트'
# 상의
elif '카라티' in x or '카라반팔' in x or '카라 반팔' in x or 'polo shirt' in x or '폴로 티셔츠' in x or 'pk shirt' in x or 'pique shirt' in x or '피케셔츠' in x or '피케 셔츠' in x or '칼라티' in x or '칼라반팔' in x or '칼라 반팔' in x:
return '카라티'
elif '터틀넥' in x or '터틀 넥' in x or 'turtle neck' in x or 'polo neck' in x or '폴라 티셔츠' in x or '목폴라' in x or '폴라넥' in x:
return '폴라 티셔츠'
elif '탱크탑' in x or '탱크 탑' in x:
return '탱크탑'
elif '크롭니트' in x or '크롭 니트' in x or 'crop knit' in x or '크롭트 니트' in x or '크롭트니트' in x:
return '크롭 니트'
elif '세미오버 니트' in x or '세미오버니트' in x:
return '세미오버 니트'
elif '폴로넥 스웨터' in x or '터틀넥 스웨터' in x or '폴로넥 니트' in x or '터틀넥 니트' in x:
return '폴로넥 스웨터'
elif '데님 셔츠' in x or '데님셔츠' in x or 'denim shirt' in x:
return '데님 셔츠'
elif '린넨 셔츠' in x or '린넨셔츠' in x or 'linen shirt' in x:
return '린넨 셔츠'
elif '스트라이프 셔츠' in x or 'striped shirt' in x or '스트라이프셔츠' in x:
return '스트라이프 셔츠'
elif '데님 셔츠' in x or '데님셔츠' in x or 'denim shirt' in x:
return '데님 셔츠'
elif '긴팔 티셔츠' in x or '긴팔티셔츠' in x or 'long sleeve' in x:
return '긴팔 티셔츠'
elif '크롭 셔츠' in x or '크롭셔츠'in x or 'cropped shirt' in x:
return '크롭 셔츠'
elif '스웻 셔츠' in x or '스웻셔츠' in x or 'sweatshirt' in x or '맨투맨' in x or 'sweat shirt' in x:
return '맨투맨'
elif '포플린 셔츠' in x or '포플린셔츠' in x or 'poplin shirt' in x:
return '포플린 셔츠'
elif '플레어 셔츠' in x or '플레어셔츠' in x or 'flared shirt' in x:
return '플레어 셔츠'
elif '카라 블라우스' in x or 'collar blouse' in x or '카라블라우스' in x or '칼라 블라우스' in x or '칼라블라우스' in x:
return '카라 블라우스'
elif '퍼프 블라우스' in x or 'puff sleeve blouse' in x or '퍼프블라우스' in x:
return '퍼프 블라우스'
elif '셔링 블라우스' in x or 'shirring blouse' in x or '셔링블라우스' in x:
return '셔링 블라우스'
elif '민소매 블라우스' in x or 'sleeveless blouse' in x or '민소매블라우스' in x:
return '민소매 블라우스'
elif '케이블 니트' in x or '케이블니트' in x or 'cable knit' in x:
return '케이블 니트'
elif '믹스니트' in x or '믹스 니트' in x or 'mix knit' in x:
return '믹스니트'
# elif '카라 니트' in x or '카라니트' in x:
# return '카라 니트'
elif '카라 스웨터' in x or '카라 니트' in x:
return '카라 스웨터'
elif '티셔츠' in x or 't-shirt' in x or '티 셔츠' in x or '반팔 티셔츠' in x or '반팔티셔츠' in x or '헨리넥' in x or '헨리 넥' in x:
return '티셔츠'
elif '셔츠' in x or 'shirt' in x:
return '셔츠'
elif '블라우스' in x or 'blouse' in x:
return '블라우스'
elif '후드티' in x or 'hood t-shirt' in x:
return '후드티'
elif '후드집업' in x or '후드 집업' in x or 'hood zip' in x:
return '후드집업'
elif '스웨터' in x or 'sweater' in x:
return '스웨터'
# 아우터
elif '바람막이' in x or '바람 막이' in x or '윈드자켓' in x or '윈드 자켓' in x:
return '바람막이'
elif '아가일 가디건' in x or '아가일가디건' in x or 'argyle cardigan' in x:
return '아가일 가디건'
elif '니트 가디건' in x or '니트가디건' in x or 'knitted cardigan' in x:
return '니트 가디건'
elif '블렌드 가디건' in x or '블렌드가디건' in x:
return '블렌드 가디건'
elif '램스울 가디건' in x or '램스울가디건' in x:
return '램스울 가디건'
elif '크롭 가디건' in x or '크롭가디건' in x or '크랍가디건' in x or '크랍 가디건' in x:
return '크롭 가디건'
elif '모헤어 가디건' in x or '모헤어가디건' in x or 'mohair cardigan' in x:
return '모헤러 가디건'
elif '숏 패딩' in x or '숏패딩' in x or 'short padding' in x:
return '숏패딩'
elif '롱 패딩' in x or '롱패딩' in x or 'long padding' in x:
return '롱패딩'
elif '싱글 자켓' in x or '싱글자켓' in x or 'single jacket' in x:
return '싱글 자켓'
elif '로코 자켓' in x or '로코자켓' in x:
return '로코 자켓'
elif '보머 자켓' in x or '보머자켓' in x or 'bomber jacket' in x:
return '보머 자켓'
elif '레더 자켓' in x or '레더자켓' in x or 'leather jacket' in x:
return '레더 자켓'
elif '데님 자켓' in x or '데님자켓' in x or 'denim jacket' in x:
return '데님 자켓'
elif '아노락 자켓' in x or '아노락자켓' in x or 'anorak jacket' in x:
return '아노락 자켓'
elif '스타디움 자켓' in x or '스타디움자켓' in x:
return '스타디움 자켓'
elif '집업 자켓' in x or '집업자켓' in x or 'zip jacket' in x:
return '집업 자켓'
elif '울 자켓' in x or '울자켓' in x or 'wool jacket' in x:
return '울 자켓'
elif '퍼 자켓' in x or '털 자켓' in x or '퍼자켓' in x or '털자켓' in x:
return '퍼 자켓'
elif '후드 자켓' in x or '후드자켓' in x:
return '후드 자켓'
elif '숏 자켓' in x or '숏자켓' in x or 'short jacket' in x:
return '숏 자켓'
elif '체크 자켓' in x or '체크자켓' in x or 'check jacket' in x:
return '체크 자켓'
elif '싱글 자켓' in x or '싱글자켓' in x or 'single jacket' in x:
return '싱글 자켓'
elif '트러커 자켓' in x or '트러커자켓' in x or 'trucker jacket' in x:
return '트러커 자켓'
elif '워크 자켓' in x or '워크자켓' in x or 'work jacket' in x:
return '워크 자켓'
elif '스웨이드 자켓' in x or '스웨이드자켓' in x or 'suede jacket' in x:
return '스웨이드 자켓'
elif '눕시 자켓' in x or '눕시자켓' in x:
return '눕시 자켓'
elif '롱 코트' in x or '롱코트' in x or 'long coat' in x:
return '롱 코트'
elif '더블 코트' in x or '더블코트' in x or 'double coat' in x:
return '더블 코트'
elif '퍼 코트' in x or '털 코트' in x or '퍼코트' in x or '털코트' in x or 'fur coat' in x:
return '퍼코트'
elif '싱글코트' in x or '싱글 코트' in x or 'single coat' in x:
return '싱글코트'
elif '더플코트' in x or '더플 코트' in x or 'duffel coat' in x:
return '더플코트'
elif '숏 코트' in x or '숏코트' in x or 'short coat' in x:
return '숏 코트'
elif '울 코트' in x or '울코트' in x or 'wool coat' in x:
return '울 코트'
elif '다운 코트' in x or '다운코트' in x or 'down coat' in x:
return '다운 코트'
elif '맥 코트' in x or '맥코트' in x or 'mccourt' in x or 'mc court' in x:
return '맥 코트'
elif '트렌치 코트' in x or '트렌치코트' in x or 'trench coat' in x:
return '트렌치 코트'
elif '레더코트' in x or '레더 코트' in x or 'leather coat' in x:
return '레더 코트'
elif '피코트' in x or '피 코트' in x or 'pea coat' in x:
return '피코트'
elif '체크코트' in x or '체크 코트' in x or 'check coat' in x:
return '체크 코트'
elif '퀼팅 자켓' in x or '퀼팅자켓' in x:
return '퀼팅 자켓'
elif '플리스 자켓' in x or '플리스자켓' in x or 'fleece jacket' in x:
return '플리스 자켓'
elif '덤블 자켓' in x or '덤블자켓' in x:
return '덤블 자켓'
elif '오버사이즈 블레이저' in x or '오버사이즈블레이저' in x or '오버사이즈 핏 블레이저' in x or '오버사이즈핏 블레이저' in x or '세미오버 블레이저' in x:
return '오버사이즈 블레이저'
elif '다운 블레이저' in x or '다운 블레이저' in x or 'down blazer' in x:
return '다운 블레이저'
elif '베이식블레이저' in x or '베이식 블레이저' in x:
return '베이식 블레이저'
elif '스테이 블레이저' in x or '스테이블레이저' in x or 'stay blazer' in x:
return '스테이 블레이저'
elif '플루이드 블레이저' in x or '플루이드블레이저' in x:
return '플루이드 블레이저'
elif '체크블레이저' in x or '체크 블레이저' in x or 'check blazer' in x:
return '체크 블레이저'
elif '울 블레이저' in x or '울블레이저' in x:
return '울 블레이저'
elif '싱글 블레이저' in x or '싱글블레이저' in x or 'single blazer' in x:
return '싱글 블레이저'
elif '더블 블레이저' in x or '더블블레이저' in x or 'double blazer' in x:
return '더블 블레이저'
elif '레더 블레이저' in x or '레더블레이저' in x or 'leather blazer' in x:
return '레더 블레이저'
너무 길어서 올리지말까 하다가 그냥 올렸습니다
텍스트파일을을 로드하고 전처리를 사용목적에 맞게 진행합니다
import pandas as pd
import numpy as np
# 이걸로하면됨
with open("test_full2.txt", "r") as f:
example = f.readlines() # ['첫 번째 줄\n', '두 번째 줄\n', '세 번째 줄'] 저장
musinsa=[]
for line in example:
musinsa.append(line.strip())
# 골뱅이 제거
clothes=[]
for i in musinsa:
clothes.append(i.split('@'))
# 전처리 시작
Clothes_recommendation=[]
for i in clothes:
a=[]
for j in i:
j=j.lower()
b=whats_your_color(j)
c=what_kind_of_clothes(j)
if type(b) == str and type(c) ==str:
a.append(b+' '+c)
if len(a) > 1:
Clothes_recommendation.append(a)
# word2vec
from gensim.models import Word2Vec
model = Word2Vec(sentences = Clothes_recommendation)
model.save('word2vec.model')
word2vec 모델을 저장해줍니다
애초에 전처리 코드가 빠르게 실행되긴하지만 그래도 모델을 따로 빼서 저장해둡니다
streamlit에서도 플라스크처럼 저장된 모델을 이용해 서비스하는경우를 많아 자연스럽게 그렇게 진행했습니다
streamlit 코드입니다
import streamlit as st
st.title('옷 추천 AI')
# st.write("입고계신 옷의 개수가 하나면 하나만 선택해주세요")
option1 = st.selectbox('입고 계신 옷의 개수',
('1', '2'))
option2 = st.selectbox('현재 입고계신 옷1 색깔',
('흰색', '베이지색', '검정', '회색', '남색', '카키색', '갈색', '초록색', '파란색', '핑크색', '빨간색', '보라색', '노란색', '주황색', '민트색', '오트밀색'))
option3 = st.selectbox('현재 입고계신 옷1 부위',
('데님 팬츠', '슬랙스', '린넨 팬츠', '카고 팬츠', '퍼티그 팬츠', '조거 팬츠', '코듀로이 팬츠', '치노 팬츠', '스웨트 팬츠', '스웨트 쇼츠', '쇼츠', '반바지', '버뮤다 팬츠', '데님 스커트', '미디 스커트', '미니 스커트', '플리츠 스커트', '플레어 스커트', '롱 스커트', '카라티', '폴라 티셔츠', '탱크탑', '크롭 니트', '세미오버 니트', '폴로넥 스웨터', '데님 셔츠', '린넨 셔츠', '스트라이프 셔츠', '데님 셔츠', '긴팔 티셔츠', '크롭 셔츠', '스웻 셔츠', '포플린 셔츠', '플레어 셔츠', '카라 블라우스', '퍼프 블라우스', '셔링 블라우스', '민소매 블라우스', '케이블 니트', '믹스니트', '카라 스웨터', '티셔츠', '셔츠', '블라우스', '후드티', '후드집업', '스웨터', '바람막이', '아가일 가디건', '니트 가디건', '블렌드 가디건', '램스울 가디건', '크롭 가디건', '모헤러 가디건', '숏패딩', '롱패딩', '싱글 자켓', '로코 자켓', '보머 자켓', '레더 자켓', '데님 자켓', '아노락 자켓', '스타디움 자켓', '집업 자켓', '울 자켓', '퍼 자켓', '후드 자켓', '숏 자켓', '체크 자켓', '싱글 자켓', '트러커 자켓', '워크 자켓', '스웨이드 자켓', '눕시 자켓', '롱 코트', '더블 코트', '퍼코트', '싱글코트', '더플코트', '숏 코트', '울 코트', '다운 코트', '맥 코트', '트렌치 코트', '레더 코트', '피코트', '체크 코트', '퀼팅 자켓', '플리스 자켓', '덤블 자켓', '오버사이즈 블레이저', '다운 블레이저', '베이식 블레이저', '플루이드 블레이저', '체크 블레이저', '울 블레이저', '싱글 블레이저', '더블 블레이저', '레더 블레이저'))
option4 = st.selectbox('현재 입고계신 옷2 색깔',
('흰색', '베이지색', '검정', '회색', '남색', '카키색', '갈색', '초록색', '파란색', '핑크색', '빨간색', '보라색', '노란색', '주황색', '민트색', '오트밀색'))
option5 = st.selectbox('현재 입고계신 옷2 부위',
('데님 팬츠', '슬랙스', '린넨 팬츠', '카고 팬츠', '퍼티그 팬츠', '조거 팬츠', '코듀로이 팬츠', '치노 팬츠', '스웨트 팬츠', '스웨트 쇼츠', '쇼츠', '반바지', '버뮤다 팬츠', '데님 스커트', '미디 스커트', '미니 스커트', '플리츠 스커트', '플레어 스커트', '롱 스커트', '카라티', '폴라 티셔츠', '탱크탑', '크롭 니트', '세미오버 니트', '폴로넥 스웨터', '데님 셔츠', '린넨 셔츠', '스트라이프 셔츠', '데님 셔츠', '긴팔 티셔츠', '크롭 셔츠', '스웻 셔츠', '포플린 셔츠', '플레어 셔츠', '카라 블라우스', '퍼프 블라우스', '셔링 블라우스', '민소매 블라우스', '케이블 니트', '믹스니트', '카라 스웨터', '티셔츠', '셔츠', '블라우스', '후드티', '후드집업', '스웨터', '바람막이', '아가일 가디건', '니트 가디건', '블렌드 가디건', '램스울 가디건', '크롭 가디건', '모헤러 가디건', '숏패딩', '롱패딩', '싱글 자켓', '로코 자켓', '보머 자켓', '레더 자켓', '데님 자켓', '아노락 자켓', '스타디움 자켓', '집업 자켓', '울 자켓', '퍼 자켓', '후드 자켓', '숏 자켓', '체크 자켓', '싱글 자켓', '트러커 자켓', '워크 자켓', '스웨이드 자켓', '눕시 자켓', '롱 코트', '더블 코트', '퍼코트', '싱글코트', '더플코트', '숏 코트', '울 코트', '다운 코트', '맥 코트', '트렌치 코트', '레더 코트', '피코트', '체크 코트', '퀼팅 자켓', '플리스 자켓', '덤블 자켓', '오버사이즈 블레이저', '다운 블레이저', '베이식 블레이저', '플루이드 블레이저', '체크 블레이저', '울 블레이저', '싱글 블레이저', '더블 블레이저', '레더 블레이저'))
option6 = st.selectbox('추천 받으실 옷 부위',
('하의', '상의', '아우터'))
n=['데님 팬츠', '슬랙스', '린넨 팬츠', '카고 팬츠', '퍼티그 팬츠', '조거 팬츠', '코듀로이 팬츠', '치노 팬츠', '스웨트 팬츠', '스웨트 쇼츠', '쇼츠', '반바지', '버뮤다 팬츠', '데님 스커트', '미디 스커트', '미니 스커트', '플리츠 스커트', '플레어 스커트', '롱 스커트']
m=['카라티', '폴라 티셔츠', '탱크탑', '크롭 니트', '세미오버 니트', '폴로넥 스웨터', '데님 셔츠', '린넨 셔츠', '스트라이프 셔츠', '데님 셔츠', '긴팔 티셔츠', '크롭 셔츠', '스웻 셔츠', '포플린 셔츠', '플레어 셔츠', '카라 블라우스', '퍼프 블라우스', '셔링 블라우스', '민소매 블라우스', '케이블 니트', '믹스니트', '카라 스웨터', '티셔츠', '셔츠', '블라우스', '후드티', '후드집업', '스웨터']
q=['바람막이', '아가일 가디건', '니트 가디건', '블렌드 가디건', '램스울 가디건', '크롭 가디건', '모헤러 가디건', '숏패딩', '롱패딩', '싱글 자켓', '로코 자켓', '보머 자켓', '레더 자켓', '데님 자켓', '아노락 자켓', '스타디움 자켓', '집업 자켓', '울 자켓', '퍼 자켓', '후드 자켓', '숏 자켓', '체크 자켓', '싱글 자켓', '트러커 자켓', '워크 자켓', '스웨이드 자켓', '눕시 자켓', '롱 코트', '더블 코트', '퍼코트', '싱글코트', '더플코트', '숏 코트', '울 코트', '다운 코트', '맥 코트', '트렌치 코트', '레더 코트', '피코트', '체크 코트', '퀼팅 자켓', '플리스 자켓', '덤블 자켓', '오버사이즈 블레이저', '다운 블레이저', '베이식 블레이저', '플루이드 블레이저', '체크 블레이저', '울 블레이저', '싱글 블레이저', '더블 블레이저', '레더 블레이저']
from gensim.models import Word2Vec
@st.cache(allow_output_mutation=True)
def loading():
# path = "C:\Users\A\Desktop\vscode_files\crawling_naver_movie\word2vec.model"
# model=Word2Vec.load(path)
model=Word2Vec.load("C:/Users/A/Desktop/vscode_files/crawling_naver_movie/word2vec.model")
return model
model = loading()
a=option2+' '+option3
b=option4+' '+option5
c= option6
if c=='하의':
c=n
elif c =='상의':
c=m
elif c== '아우터':
c=q
try:
if option1=='1':
z=model.wv.most_similar([a])
else:
z=model.wv.most_similar([a,b])
except:
st.write('추천할 옷이 없습니다!')
# 결과 도출
else:
n=0
for i in z:
if n!=0:
break
for j in c:
if j in i[0]:
st.write(f'{i[0]}을(를) 추천드립니다!')
n+=1
break
코드를 실행시키면 특정 문장이라고 할까요? 그게 나오는데
그걸 터미널이나 cmd에 붙여넣기하면 웹이 실행이됩니다 특이하죠?
처음에 streamlit 검색할때 어떻게 실행하는지를 잘 모르겠어서 많이 해맸었는데 이런 방식이더군요
vocab안에 단어 그러니까 옷이 없을 경우 에러가 뜹니다
try, except, else구문을 이용하여 해결했습니다
streamlit을 처음써봤는데 아주좋았습니다 사용법도 간편하고 html코드 다룰필요없고
데이터프레임이나 그래프등을 나타낼수도있고, 디자인좋고, 코드가 간편해서 좋았습니다
일반적이진않지만 배포도 가능하다던데 아직은 생각없지만 나중에 괜찮은 아이디어 나오면 해봐야겠죠? ㅎㅎ
프로젝트를 완료하고 글쓴게아니고 하면서 중간에 글쓴게 대부분이라 두서가 없는점 양해부탁드립니다
다하고 기록으로서 글쓰면 재미가없어서 보통 이렇게 진행하고있습니다
streamlit 실행화면
다음에 더 재밌는 프로젝트로 돌아오겠습니다!!
데이콘 자율주행 센서의 안테나 성능 예측 AI 경진대회 리뷰(1) - 공부진행방식소개, 베이스라인코드, 데이터 보기 (0) | 2022.09.04 |
---|---|
큰 데이터 이용시 jupyter notebook 커널 죽는 현상 해결방안 찾아보기 (0) | 2022.08.31 |
RNN이란 무엇인가 (0) | 2022.07.22 |
kobert를 이용한 영화리뷰 긍정,부정 분류와 대표리뷰 뽑아내기 (0) | 2022.07.21 |
Digit Recognizer - kaggle 컴퓨터비전 차근차근 이해해보기 (0) | 2022.07.17 |