검색 결과 스크래핑 & doc2vec의 기업 카테고리 (3)

검색 결과 스크래핑 & doc2vec의 기업 카테고리 (1)
검색 결과 스크래핑 & doc2vec의 기업 카테고리 (2)
마지막 라운드입니다. 이번에는 작성한 모델을 클러스터링하기 위해 덴드로그램을 작성합니다.

이번 구성


  • Google 검색결과에서 사이트 URL 가져오기 및 검색결과 텍스트 가져오기(beautifulsoup)
  • Doc2vec으로 벡터화
  • 덴드로그램 작성 ← 지금 코코

  • gensim의 word2vec에서 단어의 벡터 표현을 만들고 그 공간을 시험해보고 싶습니다. 을 참고로 Doc2vec의 모델로부터 벡터 부분을 꺼내 그래프화 했습니다.
    가장 곤란한 것은, Doc2vec의 모델에 그 attribution은 없어, 라고 하는 에러가 빈발하는 것과, 보통으로 변경해도 화상 사이즈가 커지지 않는 것이었습니다.

    라이브러리 로드



    matplotlib과 scipy를 사용합니다.
    import gensim
    import sys
    import scipy.spatial.distance
    import scipy.cluster.hierarchy
    import matplotlib.pyplot as plt
    import numpy as np
    

    모델 로드



    마지막으로 저장된 모델을 로드합니다.
    model = gensim.models.word2vec.Word2Vec.load('doc2vec.model')
    

    덴드로그램 생성을 위한 데이터 성형


  • 태그(라벨):model.docvecs.doctags에 들어가 있습니다.
  • 내용 (벡터) : model.docvecs['임의의 태그 이름']으로 그려서 이것.
  • 단어 목록 : model.wv.vocab

  • 여기까지 알면 거의 완성입니다.
    태그 목록을 만들고 그 목록을 바탕으로 모델에서 벡터를 빼내어 전달합니다.
    vocnew = list(map(lambda x: x, model.docvecs.doctags))
    voc = scipy.cluster.hierarchy.linkage(model.docvecs[vocnew])
    

    출력


    scipy.cluster.hierarchy.dendrogram(voc, labels=vocnew, ax=axes[0])
    plt.show()
    



    이미지 크기 변경



    너무 작아서 읽을 수 없기 때문에, 화상을 크게 하고 싶네요.
    창 분할하여 사이즈 지정할 수 있었으므로 아래에 코드를 써 둡니다. 다른 방법이 있으면 알려주세요.
    ig, axes = plt.subplots(2, 1, figsize=(30, 15))
    

    size*100픽셀로 이미지가 출력됩니다. 너무 크면 무겁기 때문에주의.

    결론



    이번에는 체계적으로 정리하고 싶었기 때문에 덴드로그램을 사용했습니다만, 이대로 k-means에 적용할 수도 있습니다.
    기업을 표현하기 위한 변수로도 사용할 수 있을까 생각합니다. 그러면 기업명을 밝히지 않고 이 기업에 묶는 다른 변수를 이용하여 모델을 만들거나 할 수 있게 됩니다.
    또 뭔가 재미있는 이용이 있으면 공유하고 싶습니다.

    좋은 웹페이지 즐겨찾기