私はいくつかの NLP タスクに Torchtext を使用しています。具体的には、組み込みの埋め込みを使用しています。
逆ベクトル検索を実行できるようにしたい: ノイズの多いベクトルを生成し、それに最も近いベクトルを見つけてから、ノイズの多いベクトルに「最も近い」単語を取得します。
torchtext docsから、組み込みデータセットに埋め込みをアタッチする方法は次のとおりです。
from torchtext.vocab import GloVe
from torchtext import data
embedding = GloVe(name='6B', dim=100)
# Set up fields
TEXT = data.Field(lower=True, include_lengths=True, batch_first=True)
LABEL = data.Field(sequential=False, is_target=True)
# make splits for data
train, test = datasets.IMDB.splits(TEXT, LABEL)
# build the vocabulary
TEXT.build_vocab(train, vectors=embedding, max_size=100000)
LABEL.build_vocab(train)
# Get an example vector
embedding.get_vecs_by_tokens("germany")
次に、迷惑インデックスを構築できます。
from annoy import AnnoyIndex
num_trees = 50
ann_index = AnnoyIndex(embedding_dims, 'angular')
# Iterate through each vector in the embedding and add it to the index
for vector_num, vector in enumerate(TEXT.vocab.vectors):
ann_index.add_item(vector_num, vector) # Here's the catch: will vector_num correspond to torchtext.vocab.Vocab.itos?
ann_index.build(num_trees)
次に、ノイズの多いベクトルを使用して単語を取得したいとします。
# Get an existing vector
original_vec = embedding.get_vecs_by_tokens("germany")
# Add some noise to it
noise = generate_noise_vector(ndims=100)
noisy_vector = original_vec + noise
# Get the vector closest to the noisy vector
closest_item_idx = ann_index.get_nns_by_vector(noisy_vector, 1)[0]
# Get word from noisy item
noisy_word = TEXT.vocab.itos[closest_item_idx]
上記の最後の 2 行について質問があります: The ann_index
was built using enumerate
over the embedding
object, which is a Torch tensor.
オブジェクトには、与えられたインデックスが単語を返す[vocab][2]
独自のリストがあります。itos
私の質問は次のとおりです: itos リストに表示される単語の順序が の順序と同じであると確信できますTEXT.vocab.vectors
か? あるインデックスを別のインデックスにマップするにはどうすればよいですか?