Q&A
かなり初歩的な質問になります。
申し訳ありません。
テキストファイルをベクトル化し、その内容をTensorBoardを使って可視化させました
その際の表示内容で分からない箇所があります
以下の表示内容の画像の右側に”方法”というワードに意味が近いものが順に並んでいると解釈しています
並んでいるワードの横に値が表示されており、その値が高いと”方法”というワードに近いと理解していたのですが、低い物から並んでいることが疑問に感じます
また、実際pythonで学習させたモデルから”方法”に近い物を出してみると表示された内容はTensorBoardに表示されているものに近いですが一致はしていません
値に関しては高いものから表示されています
同じ学習モデルを使用しているので表示内容に差が出ている原因が分からず悩んでいます
機械学習の知識も全くない状態で触れており初歩的で失礼な質問で大変申し訳ありませんがアドバイスお願い致します
python”方法”に近いもの表示
1我々 0.5427109003067017 2いたずら 0.5349133014678955 3暮らす 0.4886106848716736 4界 0.48565226793289185 5かって 0.47538068890571594 6文学 0.47107696533203125 7的 0.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
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2018/05/11 11:33
2018/05/11 11:43
2018/05/11 15:57
2018/05/15 02:14