web-dev-qa-db-ja.com

word2vec-最も近い単語を取得する

Tensorflow Word2vecモデル出力を読み取ると、特定の単語に関連する単語をどのように出力できますか?

Srcを読み取る: https://github.com/tensorflow/tensorflow/blob/r0.11/tensorflow/examples/tutorials/Word2vec/Word2vec_basic.py は、イメージのプロット方法を表示できます。

しかし、与えられた単語に最も近いn個の単語にアクセスできるようにするモデルのトレーニングの一部として作成されたデータ構造(辞書など)はありますか?たとえば、Word2vecが画像を生成した場合:

enter image description here

画像ソース: https://www.tensorflow.org/versions/r0.11/tutorials/Word2vec/index.html

この画像では、「to、he、it」という単語が同じクラスターに含まれています。入力として「to」を取り、「he、it」を出力する関数がありますか(この場合はn = 2)?

10
blue-sky

このアプローチは、一般的にWord2vecに適用されます。 Word2vecをgoogle/ GloVe Wordベクトルのようなテキスト/バイナリファイルに保存できる場合。次に必要なのは gensim だけです。

インストールするには:

github経由

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 を参照してください。

フランは近似最近傍の別のライブラリです。

11
Steven Du

私はあなたがgensimを使いたくないと仮定し、テンソルフローを使い続けることを好みます。その場合、私は2つのオプションを提供します

オプション1-テンソルボード:

探索的な観点からこれを実行しようとしているだけであれば、Tensorboardの埋め込みビジュアライザを使用して最も近い埋め込みを検索することをお勧めします。それはクールなインターフェースを提供し、設定された数のネイバーでコサイン距離とユークリッド距離の両方を使用できます。

Tensorboard's embedding visualizer

Tensorflowドキュメントへのリンク

オプション2-直接計算

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に変更することで、いくつかの調整を行う必要があります。

2
Nate Raw

gensim を取得し、gensim.models.Word2Vecモデルで similar_by_Word メソッドを使用します。

similar_by_Wordは3つのパラメータを受け取り、

  1. 入力ワード
  2. n-上位n個の類似単語(オプション、デフォルト= 10)
  3. restrict_vocab(オプション、デフォルト=なし)

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)
1
ngub05