Python 프로그래밍 : 위키피디아의 데이터를 사용하여 word2vec을 해보자 {4. 모델 응용편}

소개



4개 세워 기사, 4번째(마지막)입니다.
  • 데이터 취득 및 전처리편
  • 모델 작성편
  • 모델 이용편
  • 모델 응용편 ★본고

  • 본고에서 소개하는 것


  • word2vec 모델의 응용

  • 이하의 링크, 5번째에 게재된 Code를 견본으로 해, 필자가 만든 word2vec 모델을 사용해 시도했습니다!

    word2vec
    Word2vec Tutorial
    Deep learning with word2vec and gensim
    미국 google의 연구자가 개발한 Word2Vec에서 자연 언어 처리(독자 데이터)
    【Python】word2vec와 클러스터링으로 wiki 코퍼스를 사용하여 플레이

    본고에서 소개하지 않는 것


  • word2vec의 작동 방식
  • Python 라이브러리 사용법
  • gensim ※ 단어의 분산 표현 (단어 벡터)을 실현하는 Python 라이브러리

  • word2vec 모델 만들기
  • word2vec 모델 사용

  • 【정리】자연 언어 처리에 있어서의 단어 분산 표현(단어 벡터)과 문서 분산 표현(문서 벡터)
    word2vec(Skip-Gram Model)의 구조를 아마 일본 일간결하게 정리해 보겠습니다.
    【Python】Word2Vec의 사용법
    gensim/word2vec.py
    gensim: models.word2vec – Word2vec embeddings

    모델 응용편



    모델 이용에 이어 Windows에서 진행합니다.

    word2vec 모델의 응용



    여러 단어를 선택하고 각 단어의 분산 표현(단어 벡터)을 사용하여 클러스터링합니다.

    먼저 미리 작성(학습)한 word2vec 모델을 로드합니다.

    analyzeWiki_Word2Vec3
    from gensim.models import Word2Vec
    
    model = Word2Vec.load(r'..\result\jawiki_word2vec_sz200_wndw10.model')
    wv = model.wv
    

    그리고 각 단어의 분산 표현을 가져옵니다.
    분산 표현을 취득할 때, KeyError가 발생할 가능성을 고려할 필요가 있습니다만, 이번은 할애합니다. (본래라면, Try~Except의 구문을 이용하는 곳일까.)

    analyzeWiki_Word2Vec3
    from scipy.cluster.hierarchy import linkage, dendrogram
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    words = ["東京", "神奈川", "千葉", "埼玉", "日本", "アメリカ", "ドイツ", "セダン", "ワゴン", "トラック", "自動車", "飛行機", "船舶", "列車"]
    vectors = [model[word] for word in words]
    
    #日本語フォントの指定
    import matplotlib.pyplot as plt
    plt.rcParams["font.family"] = 'Yu Gothic'
    

    이하, 모델 응용의 Code를 소개.

    계층형 클러스터링(거리 함수: 워드법)



    "일본"이 "도쿄"라고 붙어 버렸습니다. 그 외는, 뭐 기대대로라고 하는 느낌입니다.

    analyzeWiki_Word2Vec3
    l = linkage(vectors, method="ward")
    plt.figure(figsize=(20, 15))
    dendrogram(l, labels=words)
    plt.savefig("../result/word_clustering_dendrogram1.png")
    



    계층형 클러스터링(거리 함수:군 평균법)



    "일본"이 "도쿄"와 붙어 버린 것은 변함없이. 그 외라면, “열차”가 왠지 먼 곳에 가 버렸습니다.

    analyzeWiki_Word2Vec3
    l = linkage(vectors, method="average")
    plt.figure(figsize=(20, 15))
    dendrogram(l, labels=words)
    plt.savefig("../result/word_clustering_dendrogram2.png")
    



    비계층형 클러스터링



    계층형 클러스터링에서도 예상치 못한 분류였던, “도쿄”가 공중 느낌으로 위치하고 있습니다.
    이 결과를 보면, 「도시」의 클러스터가 아니고, 「나라」의 클러스터(특히, 가장 가까운 “일본”)에 속하는 것도 어쩔 수 없는, 라고 납득해 버렸습니다.

    analyzeWiki_Word2Vec3
    from sklearn.cluster import KMeans
    from sklearn.decomposition import PCA
    import pandas as pd
    import matplotlib.pyplot as plt
    from collections import defaultdict
    
    kmeans_model = KMeans(n_clusters=4, verbose=1, random_state=0).fit(vectors)
    cluster_labels = kmeans_model.labels_
    cluster_to_words = defaultdict(list)
    for cluster_id, word in zip(cluster_labels, words):
        cluster_to_words[cluster_id].append(word)
    
    print(cluster_labels)
    for l, w in cluster_to_words.items():
        print('=====')
        print(l)
        print('-----')
        print(w)
        print('=====')
    
    df = pd.DataFrame(vectors)
    df["word"] = words
    df["cluster"] = cluster_labels
    
    #PCAで2次元に圧縮
    pca = PCA(n_components=2)
    pca.fit(df.iloc[:, :-2])
    feature = pca.transform(df.iloc[:, :-2])
    
    #日本語フォントの指定
    import matplotlib.pyplot as plt
    plt.rcParams["font.family"] = 'Yu Gothic'
    
    #散布図プロット
    color = {0:"green", 1:"red", 2:"yellow", 3:"blue"}
    colors = [color[x] for x in cluster_labels]
    plt.figure(figsize=(20, 20))
    for x, y, name in zip(feature[:, 0], feature[:, 1], df.iloc[:, -2]):
        plt.text(x, y, name)
    plt.scatter(feature[:, 0], feature[:, 1], color=colors)
    plt.savefig("../result/word_clustering_scatter.png")
    plt.show()
    



    요약



    위키피디아의 전처리된 데이터로부터 작성된, word2vec 모델을 응용하는 방법을 소개.

    좋은 웹페이지 즐겨찾기