Tensorflow Word2vecモデル出力を読み取ると、特定の単語に関連する単語をどのように出力できますか?
Srcを読み取る: https://github.com/tensorflow/tensorflow/blob/r0.11/tensorflow/examples/tutorials/Word2vec/Word2vec_basic.py は、イメージのプロット方法を表示できます。
しかし、与えられた単語に最も近いn個の単語にアクセスできるようにするモデルのトレーニングの一部として作成されたデータ構造(辞書など)はありますか?たとえば、Word2vecが画像を生成した場合:
画像ソース: https://www.tensorflow.org/versions/r0.11/tutorials/Word2vec/index.html
この画像では、「to、he、it」という単語が同じクラスターに含まれています。入力として「to」を取り、「he、it」を出力する関数がありますか(この場合はn = 2)?
このアプローチは、一般的にWord2vecに適用されます。 Word2vecをgoogle/ GloVe Wordベクトルのようなテキスト/バイナリファイルに保存できる場合。次に必要なのは gensim だけです。
インストールするには:
Pythonコード:
from gensim.models import Word2Vec
gmodel=Word2Vec.load_Word2vec_format(fname)
ms=gmodel.most_similar('good',10)
for x in ms:
print x[0],x[1]
ただし、これによりすべての単語が検索されて結果が得られます。おおよその最近傍(ANN)があり、結果はより速くなりますが、精度は犠牲になります。
最新のgensimでは、ANNを実行するために annoy が使用されます。詳細については、この notebooks を参照してください。
私はあなたがgensimを使いたくないと仮定し、テンソルフローを使い続けることを好みます。その場合、私は2つのオプションを提供します
探索的な観点からこれを実行しようとしているだけであれば、Tensorboardの埋め込みビジュアライザを使用して最も近い埋め込みを検索することをお勧めします。それはクールなインターフェースを提供し、設定された数のネイバーでコサイン距離とユークリッド距離の両方を使用できます。
Word2vec_basic.pyファイル内に、最も近い単語を計算する方法の例があり、関数を少しいじれば、先に進んでそれを使用できます。以下はグラフ自体にあります:
_# Compute the cosine similarity between minibatch examples and all embeddings.
norm = tf.sqrt(tf.reduce_sum(tf.square(embeddings), 1, keep_dims=True))
normalized_embeddings = embeddings / norm
valid_embeddings = tf.nn.embedding_lookup(
normalized_embeddings, valid_dataset)
similarity = tf.matmul(
valid_embeddings, normalized_embeddings, transpose_b=True)
_
次に、トレーニング中に(10000ステップごと)、次のコードを実行します(セッションがアクティブな間)。彼らがsimilarity.eval()
を呼び出すとき、それはグラフの類似性テンソルのリテラルnumpy配列評価を取得しています。
_# Note that this is expensive (~20% slowdown if computed every 500 steps)
if step % 10000 == 0:
sim = similarity.eval()
for i in xrange(valid_size):
valid_Word = reverse_dictionary[valid_examples[i]]
top_k = 8 # number of nearest neighbors
nearest = (-sim[i, :]).argsort()[1:top_k+1]
log_str = "Nearest to %s:" % valid_Word
for k in xrange(top_k):
close_Word = reverse_dictionary[nearest[k]]
log_str = "%s %s," % (log_str, close_Word)
print(log_str)
_
これを自分に合わせたい場合は、_reverse_dictionary[valid_examples[i]]
_を、kに最も近い単語を取得したい単語または単語のIDXに変更することで、いくつかの調整を行う必要があります。
gensim を取得し、gensim.models.Word2Vec
モデルで similar_by_Word メソッドを使用します。
similar_by_Word
は3つのパラメータを受け取り、
例
import gensim, nltk
class FileToSent(object):
"""A class to load a text file efficiently """
def __init__(self, filename):
self.filename = filename
# To remove stop words (optional)
self.stop = set(nltk.corpus.stopwords.words('english'))
def __iter__(self):
for line in open(self.filename, 'r'):
ll = [i for i in unicode(line, 'utf-8').lower().split() if i not in self.stop]
yield ll
次に、入力した文章(sentence_file.txt)に応じて、
sentences = FileToSent('sentence_file.txt')
model = gensim.models.Word2Vec(sentences=sentences, min_count=2, hs=1)
print model.similar_by_Word('hack', 2) # Get two most similar words to 'hack'
# [(u'debug', 0.967338502407074), (u'patch', 0.952264130115509)] (Output specific to my dataset)