質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

627閲覧

python TensorBoard の表示内容について(単語ベクトルの表示)

---stax---

総合スコア148

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/05/11 03:38

編集2018/05/11 03:40

かなり初歩的な質問になります。
申し訳ありません。

テキストファイルをベクトル化し、その内容をTensorBoardを使って可視化させました
その際の表示内容で分からない箇所があります
以下の表示内容の画像の右側に”方法”というワードに意味が近いものが順に並んでいると解釈しています

並んでいるワードの横に値が表示されており、その値が高いと”方法”というワードに近いと理解していたのですが、低い物から並んでいることが疑問に感じます
また、実際pythonで学習させたモデルから”方法”に近い物を出してみると表示された内容はTensorBoardに表示されているものに近いですが一致はしていません
値に関しては高いものから表示されています

同じ学習モデルを使用しているので表示内容に差が出ている原因が分からず悩んでいます

機械学習の知識も全くない状態で触れており初歩的で失礼な質問で大変申し訳ありませんがアドバイスお願い致します

表示内容

python”方法”に近いもの表示

1我々 0.5427109003067017 2いたずら 0.5349133014678955 3暮らす 0.4886106848716736 40.48565226793289185 5かって 0.47538068890571594 6文学 0.47107696533203125 70.47081437706947327 8活動 0.4649048447608948 9研究 0.46410828828811646 10違う 0.46296119689941406

python実装内容

1from janome.tokenizer import Tokenizer 2from gensim.models import word2vec 3from sklearn.decomposition import PCA 4from sklearn.manifold import TSNE 5import matplotlib.pyplot as plt 6import matplotlib 7import logging 8import sys 9import re 10import numpy as np 11from collections import Counter 12import operator 13import logging 14 15word=[] 16word_dic = [] 17 18## 分かち書き(janome使用) 19# Tokenizerのインスタンス生成 20t = Tokenizer() 21 22#--------------------------------------------------------------関数 23 24# 文字列型を引数とする 25def extract_words(text, fp=sys.stdout): 26 27 #tokenizeメソッドに文字列の引数を渡して形態素解析を行う,tokensはlist型 28 #中身は。区切りした文が形態素解析された状態で入っている 29 #うとうととして目がさめると女はいつのまにか、隣のじいさんと話を始めている。 30 #⇒['うとうと', 'と', 'し', 'て', '目', 'が', 'さめる', 'と', '女', 'は', 'いつのまにか', '、', '隣', 'の', 'じいさん', 'と', '話', 'を', '始め', 'て', 'いる'] 31 # テキストファイル作成部分 32 tokens = t.tokenize(text) 33 for token in tokens: 34 fp.writelines(token.surface) 35 fp.write("\n") 36 37 38 #リスト内包表記を使用して形態素解析されたリストtokensの中身の品詞を、区切り,名詞・動詞原型のみを返す 39 # token.part_of_speech.split(',')[0]はjanomeで解析した内容(すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ)の一番最初の要素(名詞)を取得 40 # split(',')を表記していないと'名'しか指定されない。split(',')[0]で'名詞'と指定していることになる。 41 # token.part_of_speech.split(',')[0]の中に'名詞', '動詞'という文字列のものだけ返すイメージ 42 43 return [token.base_form for token in tokens 44 if token.part_of_speech.split(',')[0] in ['名詞', '動詞']] 45 46 47 48def flatten_by_extend(nested_list): 49 flat_list = [] 50 for e in nested_list: 51 flat_list.extend(e) 52 return flat_list 53 54 55def save_embedding_projector_files(self, vector_file, metadata_file): 56 with open(vector_file, 'w', encoding='utf-8') as f, \ 57 open(metadata_file, 'w', encoding='utf-8') as g: 58 59 # metadata file needs header 60 g.write('Word\n') 61 62 for word in self.wv.vocab.keys(): 63 embedding = self.wv[word] 64 65 # Save vector TSV file 66 f.write('\t'.join([('%f' % x) for x in embedding]) + '\n') 67 68 # Save metadata TSV file 69 g.write(word + '\n') 70 71 72 73#-----------------------------------------------------------textファイルを開く・閉じる 74 75# ファイルを開く パス⇒\はエラー、\で表記する 76# textfile = open(r'C:\Users\Desktop\sanshiro.txt')でもよい 77textfile = open('C:\Users\Desktop\sanshiro.txt') 78 79# textファイルの内容を読み込む(文字列を返す type:str型) 80line = textfile.read() 81 82# ファイルを閉じる 83textfile.close() 84 85 86#-----------------------------------------------------------ファイル整形 87 88# |の除去 89text = line.replace(r'|','') 90 91#ルビの除去 92text = re.sub(r'《.+?》', '', line) 93 94#入力注の除去 95text = re.sub(r'[#.+?]', '', line) 96 97 98# 空行の削除 99text = re.sub('\n\n', '\n', line) 100text = re.sub('\r', '', line) 101sentences = text.split('。') 102 103#-----------------------------------------------------------整形結果確認 104 105# 先頭100文字出力 106print(line[:100]) 107 108 109#----------------------------------------------------------関数呼び出し 110 111# with構文使用 112# クローズが必要な処理を簡潔に記述できる 113# ブロックが終了した際に、そのオブジェクトの終了処理が自動的に実行 114# ファイルを書き込みモードで開く。test_token.txtファイルが存在しない時は新規作成される 115 116with open("test_token.txt", "w") as fp: 117 wordlist = [extract_words(sentence,fp) for sentence in sentences] 118 119# リスト内包表記使用 120# wordlist = [extract_words(sentence,fp) for sentence in sentences] 121# 上記は以下と同じ意味 122#wordlist = [] 123#for sentence in sentences: 124# word_list.append(extract_words(sentence)) 125 126 127 128 129 130#----------------------------------------------------------単語出現回数 131 132 133countdata = flatten_by_extend(wordlist) 134counter = Counter(countdata) 135counter.most_common() 136print(counter) 137 138 139#----------------------------------------------------------word2vec学習開始 140 141 142# size: 圧縮次元数,特徴量の数 143# min_count: 出現頻度の低いものを破棄する 144# window: 前後の単語を拾う際の窓の広さを決める,文脈の最大単語数 145# iter: 機械学習の繰り返し回数(デフォルト:5)十分学習できていないときにこの値を調整する 146 147logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) 148model = word2vec.Word2Vec(wordlist, size=200, min_count=5, window=5, iter=100, seed=0 ) 149model.save('C:/Users/Desktop/word2vec.model') 150 151word2vec_model = word2vec.Word2Vec.load('C:/Users/Desktop/word2vec.model') 152 153 154save_embedding_projector_files(word2vec_model,'vector.tsv', 'metadata.tsv') 155 156 157 158#print(model['世間']) 159#print(model.__dict__['wv']['世間']) 160ret = word2vec_model.wv.most_similar(positive=['方法'], topn=10) 161for item in ret: 162 print(item[0], item[1]) 163

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

TensorBoardの方はコサイン「距離」です。重なる点同士が0になる奴。most_similarは「類似度」で、重なる点同士が1になる方。違いは1から引くかどうかだけです。

・・・それだけじゃ値の違いが説明できないので「もう一つの理由」があるはずですが、ごめんなさいよくわからないです。たぶんTensorBoardとmost_similarで計算方法が違うのでしょうけど。

投稿2018/05/11 04:39

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

R.Shigemori

2018/05/11 11:33

コサイン距離は原点から2点の角度をコサインにしているものなので0度になると1に、90度になると0になります。 most_similarはユークリッド距離と推察します。したがって距離ゼロに近いと類似していることになります。普通はわかりやすくするために逆数にするようです。 コサイン距離は2点の原点からの距離が1として計算するので原点からの距離が値に影響しません。一方、ユークリッド距離は原点からの距離が大きいと計算結果も大きくなります。そのため、あらかじめ、正規化などをします。wod2vecの重要な出力結果である単語ベクトルは値そのものに意味があるので、正規化せずに計算しているかもしれません
R.Shigemori

2018/05/11 15:57

そうだったのですね。いろいろと勘違いしてました。
---stax---

2018/05/15 02:14

回答遅くなり申し訳ありません。 自分自身、cosine類似度やcosine距離についての知識が全くない状態ですので質問自体が悪くて申し訳ありません。 回答いただいた内容について学習を進めてみます。 丁寧な回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問