2016-05-05 4 views
2

gensim word2vecでは、入力は文のリストです。しかし、テンソルフローword2vecでは、入力は単語のリスト(連結文をまとめて)です。 {target word、context word}の組を作るときに文を分ける方法はありますか? 私は次のコードを使用しています: https://github.com/tensorflow/tensorflow/blob/r0.8/tensorflow/models/embedding/word2vec.pyテンソルフローでは、word2vecモデルを実行しているときに文で区切る方法は?

+0

{target word、context word}はどういう意味ですか?私は文からの言葉が必要だと思っています。スキムグラム・モデルはコンテキスト・ワードを取り出します。 –

+3

@SungKimはい、スキムグラムモデルは文脈語を把握します。しかし、現在のモデルは長い単語リストをサポートしているだけで、各ミニバッチ内で{ターゲット単語、コンテキスト単語}の組を構成しているようです。私は代わりに各文の中に{target word、context word}の組を作りたいと思います。 –

答えて

0

この例では、ほとんどの場合、可能な限り最高のパフォーマンスを得るためにデータ処理用にカスタム演算子を使用しています。代わりに自分でデータをフィードして、訓練する単語のペアを取得することもできますが、小さなミニバッチの方が少し遅いかもしれません。大規模なミニバッチの場合は、それほど遅くすべきではありませんが、これらのタイプのモデルでは、ミニバッチを小さくして学習の進捗状況を最適化できます。

+0

これを行う方法をアドバイスできますか?私は次のステップを変更する必要があると考えました: '(単語、数、words_per_epoch、self._epoch、self._words、examples、 ラベル)= word2vec.skipgram(ファイル名= opts.train_data、 batch_size = opts.batch_size、 window_size = opts.window_size、 min_count = opts.min_count、 subsample = opts.subsample) '私は自分自身のスキップグラムアルゴリズムを書く必要がありますか?また、上のスキップグラムからの出力はテンソルです。テンソルを自分で構築する方法がわかりません。 –

4

文の最後にある単語を次の文の先頭にある単語と関連付ける(同じローカルコンテキストウィンドウの一部である)ようには思えません。もしそうなら、これを達成するためのいくつかの異なる方法があります。

word2vecのサンプルコードでコードを変更したくない場合、最も簡単な方法は、各文の最後と最初にいくつかのスペーサワードを追加することです。 window_sizeパラメータと同じくらい多くの単語を追加する必要があります。デフォルトのwindow_size5です。

例文がある場合:あなたのように最初と最後にスペーサー(ここではXYZ)を追加する必要があります
The dog jumped over the fence
:ここ
XYZ XYZ XYZ XYZ XYZ The dog jumped over the fence XYZ XYZ XYZ XYZ XYZ

0

はTensorflow例からスキップグラムペアジェネレータです:あなたはモジュール上で実行した場合https://github.com/tensorflow/tensorflow/blob/r0.9/tensorflow/examples/tutorials/word2vec/word2vec_basic.py

# Step 3: Function to generate a training batch for the skip-gram model. 
def generate_batch(batch_size, num_skips, skip_window): 
    global data_index 
    assert batch_size % num_skips == 0 
    assert num_skips <= 2 * skip_window 
    batch = np.ndarray(shape=(batch_size), dtype=np.int32) 
    labels = np.ndarray(shape=(batch_size, 1), dtype=np.int32) 
    span = 2 * skip_window + 1 # [ skip_window target skip_window ] 
    buffer = collections.deque(maxlen=span) 
    for _ in range(span): 
    buffer.append(data[data_index]) 
    data_index = (data_index + 1) % len(data) 
    for i in range(batch_size // num_skips): 
    target = skip_window # target label at the center of the buffer 
    targets_to_avoid = [ skip_window ] 
    for j in range(num_skips): 
     while target in targets_to_avoid: 
     target = random.randint(0, span - 1) 
     targets_to_avoid.append(target) 
     batch[i * num_skips + j] = buffer[skip_window] 
     labels[i * num_skips + j, 0] = buffer[target] 
    buffer.append(data[data_index]) 
    data_index = (data_index + 1) % len(data) 
    return batch, labels 

、あなたは各ミニバッチ内{ターゲット単語、文脈語}のペアを取得します。 originated -> asoriginated -> anarchism:スキップグラムは、コンテキストの単語を予測しているので

with num_skips = 2 and skip_window = 1: 
    batch: ['originated', 'originated', 'as', 'as', 'a', 'a', 'term', 'term', 'of', 'of', 'abuse', 'abuse', 'first', 'first', 'used', 'used'] 
    labels: ['as', 'anarchism', 'originated', 'a', 'term', 'as', 'a', 'of', 'term', 'abuse', 'of', 'first', 'used', 'abuse', 'against', 'first'] 

:あなたのデータは

data: ['anarchism', 'originated', 'as', 'a', 'term', 'of', 'abuse'] 

のように見えるならば、あなたは下の入力と出力のペアを取得します。例えば

、。

私はCBOWバッチジェネレータの実装も行っています。もし私がここにそれを掲載したいのであれば、コメントしてください。

関連する問題