우리 회사 개발 업무 특성 상 일률적으로 들어오는 상품 데이터 각 오픈 마켓에 맞게 가공 해야 할 때가 많다. 상품명에 특정 특수문자가 들어가지 않아야하고 length가 70자가 넘지 않아야 하는 아주 간단한 가공부터 상품 옵션이 각 마켓에서 필요로 하는 조건으로 바꿔줘야하는 아주 까다로운 것 까지 다양하다.
그 중 내가 개발한 알고리즘(?) 중에 가장 뿌듯했던 것을 소개해보고자 한다.
그것은 바로 키워드 추출 알고리즘이다.
여기서 말하는 키워드란 오픈 마켓을 사용하는 이용자가 어떤 상품을 찾기 위해 가장 많이 사용하는 검색어를 말한다. 모든 마켓에서 키워드가 필요하지만 쿠팡에서는 키워드와 가격 설정이 상품을 상위 노출 시키는데 다른 마켓보다 더욱 중요하다 (쿠팡에서도 키워드 입력을 적극 추천한다). 가격 설정 알고리즘도 개발하였는데 이 부분은 나중에 소개할 기회가 된다면 블로그에 올리도록 하겠다.
우리 회사가 쿠팡 이용자들이 사용하는 검색어들을 실시간으로 추적하여 데이터를 가지고 올 수 있다면 더욱 정확한 분석을 통해 키워드를 추출할 수 있겠지만 그게 아니니 쿠팡 검색어 자동 완성 단어들을 가지고 오기로 했다. 하지만 어떠한 이유로 쿠팡에서 Open API에 공개된 API외에는 해외 IP들을 차단되게끔 해놔서 기껏 다 만들어 놓고 사용할 수 없게 되어 네이버 쇼핑 검색 api를 이용하게 되었다.
먼저 한 단어를 검색했을 때, 자동완성 되는 단어들을 결과값으로 얻게 되는 함수이다.
하얀색 네모로 표시된 부분은 네이버 쇼핑 api를 통해 자동완성 되는 부분을 리턴값으로 가져온다. 하지만 리턴값이 JSON이 아닌 HTML이므로 파란색 네모 부분처럼 처리를 해줘야 HTML리턴값을 확인 할 수 있다. 하지만...
보시는 바와 같이 엄청 추접하게 나온다. 다른 검색어들로 여러번 돌려본 결과, 녹색 네모부분은 공통적으로 나온다는것을 파악했고 그 부분의 인덱스를 파이썬 문자열 내장 함수인 rfind()로 찾아내서 잘라내고 노란색 부분을 통하여 nested list들까지 flatten 시켜보았지만 ..
여전히 추접하다. 이때쯤 그만두고 싶었지만 조금 더 자세히 들여다 보니 각 빨간색 동그라미 부분과 같이 4i 인덱스에서 내가 필요로 하는 키워드들이 있다라는 것을 파악했다.
그래서 빨간색 네모 부분과 같이 0번 인덱스부터 4번째 인덱스들을 추출하도록 하는 for loop을 만들었는데 이 부분에서 문제가 발생했다. 정상적인 검색어들의 범위를 벗어나게 되면 검색어와 상관없는 숫자 또는 url들이 나와서 아래와 같이 쓸데없는 것들이 키워드 리스트로 들어가게 되는 것이다.
고민을 많이 했다. 어떻게 하면 효과적으로 쓸데없는 것들을 처리할 수 있을까.. 고심끝에 얻은 결론은 무의식적으로 사용하는 try, except구문을 사용하는 것이었다. 통상적으로 정상적인 부분을 처리하는 부분이 try이고, try에서 발생하는 에러들을 처리하는 부분이 except인데 이것을 거꾸로 사용하면 어떨까하고 시도해본 방법이었는데 다행히도 성공적이었다.
빨간색 네모의 try를 보면, 리스트 안의 item들을 돌면서 전부 int(item)을 거치게 한다. 스트링을 int화 시키게 되면 에러가 생기게 되고 에러가 생긴다면 숫자가 아닌 것이고 숫자가 아니라면 내가 찾는 검색어이므로 final_keyword_list로 들어가게 된다. 따라서 내가 찾는 또는 정상적인 부분을 에러로 인식하게끔 만들어 except부분에서 처리하는 것이다.
위에 올린 코드에는 나와 있지 않지만 이 블로그를 작성하다가 url도 포함될 수 있다라는 것을 발견했고 except부분에 아래와 같이 추가하였다. Url이라면 http는 필연적으로 가지고 있을테고 url을 포함하고 있다면 그 부분은 건너뛰게 했다.
그래서 결과적으로...
정상적인 키워드 리스트들을 리턴하게 되었다. 이 함수의 기능은 '한 단어'를 통해 자동 완성 되는 검색어들을 리턴하는 것이고, 이 함수를 for loop으로 돌려서 최종 키워드들을 리턴하는 함수는 따로 있는데 이 부분은 간단하므로 패스하겠다.
결론:
알고리즘이라고 다 대단히 어렵고 복잡한 것은 아니라는 것을 이번 기회를 통해 알게 되었다. 매일 아침 toy문제들을 포기해보면서 '아 알고리즘은 나랑 안맞는것 같다', '너무 어렵다' 라고 생각했지만 주구장창 그것만 연습해서 잘 푸는것 보다 간단한 알고리즘이라도 목적에 맞게 사용한다면 그게 바로 실전 알고리즘이고 참된 개발이 아닐까 생각해본다.
'파이썬' 카테고리의 다른 글
파이썬 데코레이터(Decorator)에 대해 간단히 알아보기 (2) | 2019.01.06 |
---|