brunch

You can make anything
by writing

C.S.Lewis

by 강한별 Nov 21. 2019

스타트업 소개 텍스트로 도메인 분류하기

우리 중에 스파이가 있어!

계기는 바야흐로 2~3개월 전(..) 한 자료를 보고 궁금증이 생겼다. 스타트업을 산업별로 분류해둔 것인데 일면 이해 되지 않는 부분이 있었다. 홈 서비스라는 명목으로 미소, 청소연구소,  WAHOME, 버킷플레이스이 묶여있는 것이다. 집이라면 집이지만 앞의 세 기업은 집<<청소>>와 관련된 것이고 후자는 인테리어, 홈 퍼니싱과 관련된 기업이다. 내 기준으로서는 다르게 묶여야 할 것 같은데(물론 나름의 이유가 있었겠지만) 다른 사람은 또 다르게 분류했다면 기계가 나누게 되면 어떻게 될까 궁금해졌다. 그래서 해봤습니다.


궁금증의 발단이 되어준 자료. Home service 안에 스파이가 있다!


과정은 이렇게 진행되었다.

1. 분석 방법 계획하기
2. 데이터 수집하기
3. 텍스트 전처리
4. 분류하기
5. 결과 확인하기
6. 시각화


1. 분석 방법 계획하기

의도하는 바는 학습 데이터를 주지 않고 알아서 묶어보게 하는 것이었다. 그리고 데이터를 어떻게 수집할지 찾았다. 각 스타트업이 어느 업종인지 확인할 수 있는 데이터란 뭘까 생각하다가 설명자료가 있다면 그걸 쓰면 되겠다고 생각했다.


2. 데이터 수집하기

모 스타트업 소개 사이트에서 기업 리스트와 간단한 설명, 상세한 설명이 있는 경우 그것까지 모두 수집하였다. selenium과 beautifulsoup를 사용했다. 수집한 결과 총 70,539건을 얻었는데 이 자체로도 많지 않지만 간단한 설명이라도 있는 경우가 15,328건으로 전체의 22%밖에 되지 않았다. 그마저도 간단한 설명은 평균 32자로, 한 문장을 대략 25자라고 가정했을 떄 약 1.5문장도 되지 않는 수준이었다. 반면 상세설명이 있는 경우 평균 501자 정도로 상태가 준수했지만 5,653건으로 수가 굉장히 적어졌다. 하지만 내가 원하는 것은 국내의 모오든 스타트업을 분류해보자는 아니었고, 상세설명이 있는 기업이 계속해서 운영을 하고 있고 의미 있는 기업인 경향이 있었기 때문에 계속 진행해보기로 했다.


3. 텍스트 전처리

수집한 텍스트를 정제하는 과정이다.

1) 쓸모 없는 구두점,  url 패턴을 삭제하였다. url 패턴을 삭제한 이유는 상세설명에 회사 사이트 링크를 건 경우가 많았기 때문이다.

2) 도메인에 맞는 단어 사전 등록했다. 우아한형제들의 경우 우아+한+형제들로 분리되어 나오면 안 되기 때문에 고유명사로 등록하는 과정을 거쳤다.

3) 불용어(의미 없는 단어들) 제외 처리했다. 기업 소개란이기도 하면서 홍보란이기 때문에 '창업', '투자', '혁신', '누적', '경진대회' 등등의 단어들이 정말 수도 없이 등장하는데, 도메인을 파악하는데 하등 도움이 안 되기 때문에 삭제하였다.

4) 1)~3)의 과정을 바탕으로 명사만 남겨두었다. 명사만으로도 파악에 무리가 없었고 명사와 하다가 결합하여 만들어진 동사인 경우 명사가 남기 때문에 충분히 의미 파악이 되었기 때문이다.

이렇게 쓰니까 굉장히 클리어한 것 같은데 실제로는 클러스터링 해보고 결과가 시원찮으면 불용어를 더 빼고 이런 식으로 n번(n에는 여러분이 상상하고 싶은 숫자를 넣자) 과정을 왔다갔다 했다.


4. 분류하기

분류하는 방법은 k-means clustering과 LDA 두 가지를 시도하였다. 그런데 LDA는 생각보다 깨끗한 결과가 나오지 않았다. LDA에 대한 자세한 설명을 이쪽을 참조하시길.


LDA로 한 결과


한편 k-means로 시도했을 때는 단어들이 훨씬 연관 있는 것들로 잘 묶여 있었다.  



그래서 결국 k-means로 마무리하게 되었다. LDA와 k-means의 차이는 문서의 토픽 개수에 대한 가정이라고 한다. 아래는 LDA와 k-means의 차이에 대한 설명이다.

k-means 도 사실 토픽 모델링으로 이용 가능합니다. 실제로 LDA 와 같은 토픽 모델링과 k-means 와의 차이는 문서의 토픽 개수에 대한 가정입니다. LDA 는 한 문서에 여러 종류의 토픽이 존재할 수 있다 가정합니다. 하지만 k-means 는 하나의 문서가 하나의 토픽이라는 가정을 합니다. 이 가정은 오히려 어떤 문서 집합에서는 유용한 사전 지식 (prior) 이 됩니다. 주로 뉴스는 한 기사에 하나의 토픽이 있습니다. 반면 한 영화에 대한 여러 관점의 리뷰라면 여러 토픽이 섞여있을 수 있습니다. 우리가 한 문서에 하나의 토픽이 존재한다고 가정한다면 굳이 over-spec 인 LDA 를 이용할 필요는 없습니다.

출처 : https://lovit.github.io/nlp/2018/09/27/pyldavis_kmeans/


내가 수집한 자료들은 복수의 토픽을 가정하는 것보다 단일한 토픽을 가정하는 게 더 잘 맞았기 때문에 k-means의 결과가 더 깔끔하게 나온 것 같다. 기업 소개 자료 자체가 여러 관점을 가지고 쓰여지는 것이 아니기도 하고.


5. 결과 확인하기

그래서 다음과 같이 14개의 분류가 나왔다. 클러스터 번호 아래의 제목은 클러스터 별로 포함된 단어 묶음을 보고 내가 이름을 붙인 것이다.


참고로 스타트업 얼라이언스 자료에서 홈서비스로 분류되어 있었던 버킷플레이스는 인테리어 클러스터로 분류되어 있었다. 버킷 플레이스 외의 인테리어 클러스터에 들어 있던 기업들은 집닥, 인테리어젠틀맨, 스페이스레븐 등등이었다. 반면 미소나 청소연구소 같은 가사서비스에 대한 군집은 없는데, 군집을 형성할 정도로 가사 서비스 기업 수가 많지 않았고 기업의 소개에서 가사 서비스가 드러나지 않아서 형성되지 않은 것 같다. (data-driven이나 매칭 알고리즘에 대한 이야기가 상당히 길게 적혀 있다) 5600여건 정도 되지 않기 때문에 군집의 개수를 많이 늘리지 않으려고 실루엣 지수가 가장 높으면서도 적은 군집수를 택했었는데 군집의 개수를 늘려서까지 확인해보지는 않았다. 하나하나 결과를 확인해봤을 때는 아주 완벽하게 분류된 것은 아닌데 정말 아주 잘 분류하는 게 중요하다면 이런 식으로 나온 결과를 토대로 주제 후보군을 정의하고 라벨을 붙인 후(인간의 수정을 거쳐) 지도학습으로 하는 게 더 나을 것 같다.


6. 시각화

시각화는 군집 단위와 문서 단위 두 가지로 진행했다. 보통 토픽 모델링을 하면 pyldavis를 많이 쓰는 것 같은데 굳이 두 가지를 해본 이유는 문서별로 어떻게 나타나는지도 궁금했기 때문이다. pyldavis는 위에서 LDA와 k-means의 결과를 비교한 것이 군집 단위의 시각화이다. 정확히는 kmeans_to_pyLDAvis를 사용했는데 이미 라이브러리를 잘 만들어주셔서 사용하기 편리했다.(감사합니다)
문서단위의 시각화는 t-sne로 차원을 축소하여 bokeh로 plot을 생성하였다. 각 점이 기업을 뜻하고 색깔이 같으면 같은 분류에 속하는 것이다. 마우스를 올리면 어떤 기업이 어떤 분류에 속하는지 확인할 수 있다. 직접 확인해보고 싶은 분을 여기에 파일을 올려두었다.


마무리하자면 이런 토이 프로젝트를 왜 하나도 다시 생각해봤는데 일단 나는 재밌었다. 그리고 나는 내가 무엇인가 알고 싶어하는 마음 자체를 소중히 여기고 싶다(뜬금 센티멘털). 그런 건 내 기준 곧잘 생겼다가도 금방 사그라들기 때문에 소중히 대하는 게 좋은 것 같다. 마지막은 내가 토이 프로젝트를 하면서 많이 공감했던 짤로 마무리하겠다.

그냥 하는 거지!

시각화

분석 방법 계획하기

시각화

분석 방법 계획하기

시각화

분석 방법 계획하기

시각화

매거진의 이전글 지속 가능한 작은 모임 꾸려나가기
작품 선택
키워드 선택 0 / 3 0
댓글여부
afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari