Word2Vec 학습된 모델을 이용한 문서 벡터의 2차원 시각화
개요
환경
OS: macOS Catalina
언어: python3.6.6
코드
여기가 만든 코드입니다. 일본어 형태소 해석에서는 MeCab을 이용하고 있습니다. Word2Vec 모델은 300차원으로 2차원으로 줄이기 위해 scikit-learn의 TSNE를 사용합니다.
patent_w2v_JP.py
from sklearn.manifold import TSNE
from gensim.models import word2vec
from statistics import mean
import string
import re
import MeCab
import pandas as pd
import numpy as np
#インプットデータの読み込み
df = pd.read_csv('input.csv', encoding="utf-8")
#タイトルと要約を結合
df['text'] = df['title'].str.cat(df['abstract'], sep=' ')
#ストップワードのリスト(もしあればこのリストに追記する)
stop_words = []
#MeCabトークナイザー
def mecab_token_list(text):
token_list = []
tagger = MeCab.Tagger()
tagger.parse('')
node = tagger.parseToNode(text)
while node:
pos = node.feature.split(",")
if not node.surface in stop_words: #ストップワードは除外
if pos[6] != '*': #見出語があればそれを追加
token_list.append(pos[6])
else: #なければ表層語を追加
token_list.append(node.surface)
node = node.next
return list(token_list)
#数字を除去
df['text_clean'] = df.text.map(lambda x: re.sub(r'\d+', '', x))
#英文字は全て小文字に統一
df['text_clean'] = df.text_clean.map(lambda x: x.lower())
#MeCab Tokenize
df['text_tokens'] = df.text_clean.map(lambda x: mecab_token_list(x))
#Word2Vecモデルの読み込み
model = word2vec.Word2Vec.load("patent_w2v_d300_20191125.model")
#データフレームを300次元の配列に初期化
doc_vec = np.zeros((df.shape[0], 300))
#各文書における出現単語のモデルカバー率を格納するリストを用意
coverage = []
#各文書の平均ベクトルを配列に格納
for i,doc in enumerate(df['text_tokens']): #形態素解析後のテキスト情報を文書順に処理
feature_vec = np.zeros(300) #300次元分を0に初期化
num_words = 0
no_count = 0
for word in doc: #各文書の単語ごとに処理
try: #単語ベクトルを加算していく処理
feature_vec += model.wv[word]
num_words += 1
except: #分析モデルの対象外の単語はパスする
no_count += 1
#得られた単語ベクトルの和を単語数で割って平均値を計算し、文書ベクトルとして格納
feature_vec = feature_vec / num_words
doc_vec[i] = feature_vec
#文書ごとの単語カバー率を計算し格納
cover_rate = num_words / (num_words + no_count)
coverage.append(cover_rate)
#単語の平均カバー率を表示
mean_coverage = round(mean(coverage)*100, 2)
print("Word cover-rate: " + str(mean_coverage) + "%")
#t-SNEによる次元削減
tsne= TSNE(n_components=2, init='pca', verbose=1, random_state=2000, perplexity=50, learning_rate=200, method='exact', n_iter=1000)
embedding = tsne.fit_transform(doc_vec)
#DataFrameに格納
embedding = pd.DataFrame(embedding, columns=['x', 'y'])
embedding["id"]= df.id
embedding["year"]= df.year
embedding["title"]= df.title
embedding["abstract"]= df.abstract
#CSVファイルとして出力
embedding.to_csv("output.csv", encoding="utf_8")
입력 데이터 구성
id
title
year
description
1
(발명의 명칭)
(출원년 등)
(본문)
2
···
···
···
유의점
2차원 시각화 이미지
matplotlib등을 사용하면 python만으로 가시화까지 할 수 있는 것 같습니다만, 참고까지 GIS(지리 정보 시스템)를 전용해 가시화하면 이러한 표현이 됩니다.
각 플롯은 문서 데이터이며 2차원 평면에서의 집중도에 따라 히트맵화됩니다. 이러한 표현은 분류나 분석의 베이스로서 유용할까 생각합니다.
Reference
이 문제에 관하여(Word2Vec 학습된 모델을 이용한 문서 벡터의 2차원 시각화), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sanskruthiya/items/ac5b499f9eef3a183f9a텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)