word2vec 영어 단어 벡터 시각화

19436 단어 word2vec파이썬
2021.3.27 수정
word2vec의 model 작성시의 인수가 size와 iter로 에러를 토해 버렸습니다.
공식적으로 변경이 있었는지 모르겠지만 수정 사항을 추가했습니다.

학습 자료



여행 리뷰 트립어드바이저의 "Hikone Castle"여행 보기 150개 리뷰를 (마침표)로 구분하여 .txt.로 저장

htps //w w. 티파 dゔぃ소 r. 이 m / 아 t 등 c 치온_레ゔぃえw-1023563-d1236815-레ゃぃえws-히코네_나 stぇ-히코네_시가_P레후ぇc트레스_킨키. HTML

txt 파일
h tps://d ゔぇ. 오, ぇ. 이 m/후에/d/1로 PVQH 니스 tf-RlsZ07F5Hdltsb에 pDs/ぃぃ에 w? 우 sp = 샤린 g

word2vec에 전달할 문장 목록



If you can dream it, you can do it.
It always seems impossible until it’s done.

라는 문장이라면

[
[If,you,can,dream,it,you,can,do,it],
[It,always,seems,impossible,until,it's,done]
]

위와 같이 단어가 끊어진 상태에서 저장이 필요합니다.

매핑 객체



이번에는 리뷰 1144 문장을 읽습니다. 등장하는 모든 단어를 벡터화하면 2차원 플롯할 때 단어로 채워질 수 있다. 상위 단어를 추출할 수 있도록 {단어: 횟수}가 되는 매핑 오브젝트를 준비. 맵핑 오브젝트의 아직도 사용하기 어려웠기 때문에 pandas에 건네준다.

stop word 삭제



이번에는 I my me as is am 같은 단어의 순위는 생략하고 싶기 때문에 nltk에서 stopword의 목록을 빌려 삭제 대상으로 했다.

단어 벡터화 및 차원 압축



200 차원에서 각 단어를 벡터화 한 다음 주성분 분석으로 차원 압축 및 플롯

실제 코드



일괄 표시입니다만, 변수를 꺼내면서 보면 좋다고 생각합니다.
# stopwordsの参照先
import nltk
from nltk.corpus import stopwords
# データフレームの作成
import pandas as pd
# Word2Vec
from gensim.models import Word2Vec
# 主成分分析
from sklearn.decomposition import PCA
# 可視化
import matplotlib.pyplot as plt

# 特定記号の削除・小文字化・リストの取得まで行う関数を設定
def sentence_preprocesser(s,delete_targets):
    """
    s:strings
    delete_targets:list
    文章s中のdelete_targetsを削除
    削除後のsentenceを小文字・リスト化してreturn
    """
    # delete_targetsのi番目があれば削除
    for i in range(len(delete_targets)):
        s = s.replace(delete_targets[i],"")
    # 小文字化    
    s=s.lower()
    # リスト化
    words = list(s.split())

    return words

# listの要素をdict型内で参照してキーが存在すれば+1,存在しなければ追加する関数
def dict_key_counter(lis,table):
    """
    lis:list
    table:dict

    list要素がtableの中に
    キーとして存在
    table[list要素] に対して +1
    キーとして存在しない
    table[list要素]=0 としてキーを作成した上で +1
    """

    for word in lis:
        table[word] = table.get(word, 0) +1

    return table

with open("pro1.txt", mode="r", encoding="utf-8") as f:hikone = f.read()
hikone_list = hikone.split("\n")
print("分析対象とした文の数:{}".format(len(hikone_list)))

# 全頻度をstockしていくマッピングオブジェクト
frequent_counter = {}
# word2vecに学習させる文
word2vec_sentence = []

for i in range(len(hikone_list)):
    sentence = hikone_list[i]
    delete_targets = [".",",","?","!","(",")","-","@"]
    # 前処理関数に通して、指定記号の削除・小文字化・リスト化まで
    words = sentence_preprocesser(sentence,delete_targets)
    # word2vecに学習させる文
    word2vec_sentence.append(words)

    # frequent_counterに各入力文章に対する 回数:頻度 のdictをストックする
    dict_key_counter(words,frequent_counter)

# frequent_counter中のstop_wordsを削除する
stop_words = stopwords.words("english")
for i in range(len(stop_words)):
    remove = frequent_counter.pop(stop_words[i],None)

# マッピングオブジェクトをデータフレームにする
df = pd.DataFrame(frequent_counter.values(), index=frequent_counter.keys())
# 初期のコラム名を変更
df = df.rename(columns={0:"count"})
# 頻度が高い順に並び替え
df = df.sort_values("count", ascending = False)
print("使用された単語の総数:{}".format(len(df.index)))


# count30以上を抽出
df_top = df[df["count"] >= 30]
df_top.plot.bar()

# castleが突出して多いのでcastleを除く
df_top2 = df_top[df_top["count"] <= 400]
df_top2.plot.bar()

df_top = df_top.T
df = df.T
# 読み込んだ文章を学習させてモデルを作成
model = Word2Vec(word2vec_sentence, size= 200, window=5, min_count=10, iter=20, sg=1)
model.save("hikone.model")
model = Word2Vec.load("hikone.model")

# count30以上の単語のベクトルを取得
wordvecs = []
for i in range(len(df_top.columns)):
    vec = model.wv[df_top.columns[i]]
    wordvecs.append(vec)
# 1単語につき、size = 200 に基づいた200次元ベクトルで表現

# 主成分分析
pca = PCA(n_components=2)
pca.fit(wordvecs)

# 射影
X_2d = pca.transform(wordvecs)

# 可視化
plt.figure(figsize=(10, 10))
for i in range(len(df_top.columns)):
    plt.plot(X_2d[i][0], X_2d[i][1], marker='>')
    plt.annotate(df_top.columns[i],(X_2d[i][0], X_2d[i][1]))



plt.show()





감상



inside,stairs,steep,steps,climb 근처가 오른쪽으로 굳어져 있다.
딱딱한 계단이기도 하는 것일까~라는 것을 알 수 있다.

그 중 다소 이질적인 inside라는 단어.

히코네성에는 천수각에 통하는 경사가 에그이게 되어 있는 계단이 있다고 한다.
inside가 이것과 연결되어 있다면 word2vec 과연이라는 인상?

수정



word2vec의 model 작성시의 인수가 size와 iter로 에러를 토해 버렸습니다.
공식적으로 변경이 있었는지 모르겠지만 수정 사항을 추가했습니다.

<수정 전>
# 読み込んだ文章を学習させてモデルを作成
model = Word2Vec(word2vec_sentence, size=200, window=5, min_count=10, iter=20, sg=1)



<수정 후>
# 読み込んだ文章を学習させてモデルを作成
model = Word2Vec(word2vec_sentence,vector_size=200,window=5,min_count=10,epochs=20,sg=1)

size→vector_size
iter→epochs

덧붙여서 이번은 Word2Vec의 곳에 커서를 맞추고, shift+tab로 인수의 헬프를 참조하는 것으로 수정 개소를 알아차릴 수 있었습니다.

좋은 웹페이지 즐겨찾기