NLP の連続バッグ オブ ワード (CBOW)
コンピュータに書かれたテキストを理解させるために、単語を数値ベクトルとして表すことができます。これを行う 1 つの方法は、単語を数値ベクトルとして表す Word 埋め込みを使用することです。これらのベクトルは、単語の意味と、言語内の他の単語との関係を捉えます。単語埋め込みは、次のような教師なし学習アルゴリズムを使用して生成できます。 Word2vec、 グローブ 、 または ファストテキスト 。
Word2vec は、単語の意味と関係を捉える単語の密なベクトル表現である単語埋め込みを生成するためのニューラル ネットワーク ベースの方法です。 Word2vec を実装するには、主に 2 つのアプローチがあります。
- 連続バッグオブワード (CBOW)
- スキップグラム
Continuous Bag of Words (CBOW) とは何ですか?
Continuous Bag of Words (CBOW) は、単語埋め込みの生成に使用される一般的な自然言語処理技術です。単語の埋め込みは、言語内の単語間の意味論的および構文的な関係を捕捉するため、多くの NLP タスクにとって重要です。 CBOW は、周囲のコンテキスト単語を考慮してターゲット単語を予測する、ニューラル ネットワーク ベースのアルゴリズムです。の一種です 監督されない 学習とは、ラベルのないデータから学習できることを意味し、感情分析や機械翻訳などのさまざまな NLP タスクに使用できる単語埋め込みの事前トレーニングによく使用されます。
CBOWモデルの例
Bag-of-Words (BoW) モデルとContinuous Bag-of-Words (CBOW) モデルの間に違いはありますか?
- Bag-of-Words モデルとContinuous Bag-of-Words モデルはどちらも、コンピュータ可読形式でテキストを表現するために自然言語処理で使用される手法ですが、コンテキストをキャプチャする方法が異なります。
- BoW モデルは、テキストを単語の集合として表し、特定の文書またはコーパス内でのその頻度を表します。単語が出現する順序や文脈は考慮されていないため、テキストの完全な意味を捉えていない可能性があります。 BoW モデルはシンプルで実装が簡単ですが、言語の意味を捉えるには限界があります。
- 対照的に、CBOW モデルは、単語のコンテキストを捉えるニューラル ネットワーク ベースのアプローチです。特定のコンテキスト ウィンドウ内でその前後に表示される単語に基づいて、ターゲットの単語を予測する方法を学習します。 CBOW モデルは、周囲の単語を考慮することで、特定のコンテキストにおける単語の意味をより適切に捉えることができます。
CBOW モデルのアーキテクチャ
CBOW モデルは、コンテキスト ワードの周囲にあるターゲット ワードを使用して予測します。上の例を考えてみましょう 彼女は素晴らしいダンサーです。 CBOW モデルは、このフレーズを文脈単語とターゲット単語のペアに変換します。単語のペアリングは次のように表示されます ([彼女、a]、は)、([は、素晴らしい]、a) ([a、ダンサー]、素晴らしい) ウィンドウ サイズ = 2 です。
CBOW アーキテクチャ
モデルは文脈上の単語を考慮して、ターゲット用語の予測を試みます。 1 つのターゲット単語を予測するためにコンテキスト単語が使用されるため、4 つの単語がある場合、4 つの 1∗W 入力ベクトルが入力層に渡されます。隠れ層は入力ベクトルを受け取り、それを W∗N 行列で乗算します。隠れ層からの 1∗N 出力は最終的に合計層に入り、最終的なアクティベーションが実行される前にベクトルが要素ごとに合計され、出力層から出力が取得されます。
CBOW のコード実装
CBOW モデルを使用して単語の類似性を示す単語埋め込みを実装してみましょう。この記事では、私自身の単語のコーパスを定義しました。任意のデータセットを使用します。まず、必要なライブラリをすべてインポートし、データセットを読み込みます。次に、各単語をトークン化し、整数のベクトルに変換します。
Python3
import> tensorflow as tf> from> tensorflow.keras.models> import> Sequential> from> tensorflow.keras.layers> import> Dense,> > Embedding, Lambda> from> tensorflow.keras.preprocessing.text> import> Tokenizer> import> numpy as np> import> matplotlib.pyplot as plt> from> sklearn.decomposition> import> PCA> # Define the corpus> corpus> => [> 'The cat sat on the mat'> ,> > 'The dog ran in the park'> ,> > 'The bird sang in the tree'> ]> # Convert the corpus to a sequence of integers> tokenizer> => Tokenizer()> tokenizer.fit_on_texts(corpus)> sequences> => tokenizer.texts_to_sequences(corpus)> print> ('After converting our words> in> the corpus> into vector of integers:')> print> (sequences)> |
出力:
After converting our words in the corpus into vector of integers: [[1, 3, 4, 5, 1, 6], [1, 7, 8, 2, 1, 9], [1, 10, 11, 2, 1, 12]]
ここで、ウィンドウ サイズ = 2 の CBOW モデルを構築します。
Python3
# Define the parameters> vocab_size> => len> (tokenizer.word_index)> +> 1> embedding_size> => 10> window_size> => 2> # Generate the context-target pairs> contexts> => []> targets> => []> for> sequence> in> sequences:> > for> i> in> range> (window_size,> len> (sequence)> -> window_size):> > context> => sequence[i> -> window_size:i]> +> > > sequence[i> +> 1> :i> +> window_size> +> 1> ]> > target> => sequence[i]> > contexts.append(context)> > targets.append(target)> # Convert the contexts and targets to numpy arrays> X> => np.array(contexts)> # Define the CBOW model> model> => Sequential()> model.add(Embedding(input_dim> => vocab_size,> > output_dim> => embedding_size,> > input_length> => 2> *> window_size))> model.add(Lambda(> lambda> x: tf.reduce_mean(x, axis> => 1> )))> model.add(Dense(units> => vocab_size, activation> => 'softmax'> ))> model.save_weights(> 'cbow_weights.h5'> )> # Load the pre-trained weights> model.load_weights(> 'cbow_weights.h5'> )> |
次に、モデルを使用して埋め込みを視覚化します。
Python3
# Get the word embeddings> embeddings> => model.get_weights()[> 0> ]> # Perform PCA to reduce the dimensionality> # of the embeddings> pca> => PCA(n_components> => 2> )> reduced_embeddings> => pca.fit_transform(embeddings)> # Visualize the embeddings> plt.figure(figsize> => (> 5> ,> 5> ))> for> i, word> in> enumerate> (tokenizer.word_index.keys()):> > x, y> => reduced_embeddings[i]> > plt.scatter(x, y)> > plt.annotate(word, xy> => (x, y), xytext> => (> 5> ,> 2> ),> > textcoords> => 'offset points'> ,> > ha> => 'right'> , va> => 'bottom'> )> plt.show()> |
出力:
CBOW モデルを使用した単語のベクトル化表現
この視覚化により、単語の埋め込みに基づいて単語の類似性を観察できるようになります。意味や文脈が似ている単語は、プロット内で互いに近くにあることが期待されます。