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

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

ただいまの
回答率

90.47%

  • Python 3.x

    6909questions

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

  • TensorFlow

    710questions

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 204

---stax---

score 66

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

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

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

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

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

表示内容

我々 0.5427109003067017
いたずら 0.5349133014678955
暮らす 0.4886106848716736
界 0.48565226793289185
かって 0.47538068890571594
文学 0.47107696533203125
的 0.47081437706947327
活動 0.4649048447608948
研究 0.46410828828811646
違う 0.46296119689941406
from janome.tokenizer import Tokenizer
from gensim.models import word2vec
from sklearn.decomposition import PCA
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
import matplotlib
import logging
import sys
import re
import numpy as np
from collections import Counter
import operator
import logging

word=[]
word_dic = []

## 分かち書き(janome使用)
# Tokenizerのインスタンス生成
t = Tokenizer()

#--------------------------------------------------------------関数

# 文字列型を引数とする
def extract_words(text, fp=sys.stdout):

    #tokenizeメソッドに文字列の引数を渡して形態素解析を行う,tokensはlist型
    #中身は。区切りした文が形態素解析された状態で入っている
    #うとうととして目がさめると女はいつのまにか、隣のじいさんと話を始めている。
    #⇒['うとうと', 'と', 'し', 'て', '目', 'が', 'さめる', 'と', '女', 'は', 'いつのまにか', '、', '隣', 'の', 'じいさん', 'と', '話', 'を', '始め', 'て', 'いる']
    # テキストファイル作成部分
    tokens = t.tokenize(text) 
    for token in tokens:
        fp.writelines(token.surface)
        fp.write("\n")            


    #リスト内包表記を使用して形態素解析されたリストtokensの中身の品詞を、区切り,名詞・動詞原型のみを返す 
    # token.part_of_speech.split(',')[0]はjanomeで解析した内容(すもも 名詞,一般,*,*,*,*,すもも,スモモ,スモモ)の一番最初の要素(名詞)を取得
    # split(',')を表記していないと'名'しか指定されない。split(',')[0]で'名詞'と指定していることになる。
    # token.part_of_speech.split(',')[0]の中に'名詞', '動詞'という文字列のものだけ返すイメージ

    return [token.base_form for token in tokens
            if token.part_of_speech.split(',')[0] in ['名詞', '動詞']]



def flatten_by_extend(nested_list):
    flat_list = []
    for e in nested_list:
        flat_list.extend(e)
    return flat_list


def save_embedding_projector_files(self, vector_file, metadata_file):
    with open(vector_file, 'w', encoding='utf-8') as f, \
         open(metadata_file, 'w', encoding='utf-8') as g:

        # metadata file needs header
        g.write('Word\n')

        for word in self.wv.vocab.keys():
            embedding = self.wv[word]

            # Save vector TSV file
            f.write('\t'.join([('%f' % x) for x in embedding]) + '\n')

            # Save metadata TSV file
            g.write(word + '\n')



#-----------------------------------------------------------textファイルを開く・閉じる

# ファイルを開く パス⇒\はエラー、\\で表記する
# textfile = open(r'C:\Users\Desktop\sanshiro.txt')でもよい
textfile = open('C:\\Users\\Desktop\\sanshiro.txt')

# textファイルの内容を読み込む(文字列を返す type:str型)
line = textfile.read()

# ファイルを閉じる
textfile.close()


#-----------------------------------------------------------ファイル整形

# |の除去
text = line.replace(r'|','')

#ルビの除去
text = re.sub(r'《.+?》', '', line)

#入力注の除去
text = re.sub(r'[#.+?]', '', line)


# 空行の削除
text = re.sub('\n\n', '\n', line) 
text = re.sub('\r', '', line)
sentences = text.split('。')

#-----------------------------------------------------------整形結果確認

# 先頭100文字出力
print(line[:100])


#----------------------------------------------------------関数呼び出し

# with構文使用
# クローズが必要な処理を簡潔に記述できる
# ブロックが終了した際に、そのオブジェクトの終了処理が自動的に実行
# ファイルを書き込みモードで開く。test_token.txtファイルが存在しない時は新規作成される

with open("test_token.txt", "w") as fp:
    wordlist = [extract_words(sentence,fp) for sentence in sentences]

# リスト内包表記使用
# wordlist = [extract_words(sentence,fp) for sentence in sentences]
# 上記は以下と同じ意味
#wordlist = []
#for sentence in sentences:
#   word_list.append(extract_words(sentence))   





#----------------------------------------------------------単語出現回数  


countdata = flatten_by_extend(wordlist)
counter = Counter(countdata)
counter.most_common()
print(counter)


#----------------------------------------------------------word2vec学習開始


# size: 圧縮次元数,特徴量の数
# min_count: 出現頻度の低いものを破棄する
# window: 前後の単語を拾う際の窓の広さを決める,文脈の最大単語数
# iter: 機械学習の繰り返し回数(デフォルト:5)十分学習できていないときにこの値を調整する

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
model = word2vec.Word2Vec(wordlist, size=200, min_count=5, window=5, iter=100, seed=0 )
model.save('C:/Users/Desktop/word2vec.model')

word2vec_model = word2vec.Word2Vec.load('C:/Users/Desktop/word2vec.model')


save_embedding_projector_files(word2vec_model,'vector.tsv', 'metadata.tsv')



#print(model['世間'])    
#print(model.__dict__['wv']['世間'])
ret = word2vec_model.wv.most_similar(positive=['方法'], topn=10) 
for item in ret:
    print(item[0], item[1])    
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/11 20:33

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

    キャンセル

  • 2018/05/11 20:43

    most_similarはcosineです。
    https://radimrehurek.com/gensim/models/keyedvectors.html#gensim.models.keyedvectors.Word2VecKeyedVectors.most_similar
    R.Shigemoriさんの仰っているコサイン距離はcosine類似度のことだと思います。cosine距離=1-cosine類似度として扱うのが一般的です。

    キャンセル

  • 2018/05/12 00:57

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

    キャンセル

  • 2018/05/15 11:14

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

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    CSVからデータを取得して検索した文字列のみを表示したい

    プログラム初心者です。 Javaを勉強中で、質問があります。 CSVからデータを取得し、取得したデータの中から検索した文字列のみを表示するプログラムを作りたいです。

  • 解決済

    python3 単語を出てきた順で数えたい

    単語の出てきた順に単語数をカウントしたいのですが、collectionsのCounterを使うと単語の多い順で表示される。かといってOrderedDictを使うと入力の読み取りをし

  • 解決済

    Javaでのページ内の全単語リストを作成するプログラム

    前提・実現したいこと Javaでの指定URLページ内の全単語リストを作成するプログラムの作成で困っています. 発生している問題・エラーメッセージ ネットからspilit関数を使

  • 解決済

    Pythonでの形態素解析について

    表題の件で質問させてください Pythonでjanomeを用いて形態素解析を行いたいと考えています windowsを用いて開発しています データベースからは value列から”

  • 解決済

    存在する組み合わせを数えたい

    例えば下のような文字列がある場合 あいう あうえ い うい この4つの文字列のうち同じ文字の組み合わせをもつ文字列を数えたいです。 上の場合、たとえば「あ」と「う」があるのは「あい

  • 解決済

    python 形態素解析した内容をテキストファイルに書く

    表題の件について質問させてください pythonで形態素解析した内容をテキストファイルに起こそうとしたのですが、書き込んだ内容が反映されず苦戦しています(生成されたテキストファイル

  • 解決済

    python 多重リストについて

    表題の件について質問させてください。 あるテキストファイルを形態素解析を行い、解析を行ったデータの出現頻度を調べたいと考えています。 しかし実行すると TypeError: unh

  • 解決済

    JanomeのAnalyzer中の引数(token_filters = token_filters)...

    サイト通りのコードを入力したのですが、エラーが出てしまいます。 問題箇所のエラーを調べたのですが、どこを探しても Analyzer(token_filters = token_

同じタグがついた質問を見る

  • Python 3.x

    6909questions

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

  • TensorFlow

    710questions