Embedding(単語の埋め込み)による文章の意味の数値化と類似度計算
こんにちは。ゆうせいです。
前回の記事で解説したBag of wordsは単語の出現回数を数える手法でしたが、コンピューターに文章の意味をより深く理解させるためには、Embedding(単語の埋め込み)という技術が不可欠です。本記事では、先ほどと同じ3つの文章を用いて、単語の意味を数値化するEmbeddingの仕組みについて解説します。
Embeddingの基本的な概念
Embeddingは、単語を単純な記号として扱うのではなく、それぞれの単語が持つ意味や性質を複数の数値の組み合わせとして表現し、多次元の空間座標に配置する手法です。
Embeddingの仕組みは、単語を「動物らしさ」「大きさ」「人間との親しさ」といった複数の評価基準を持つプロフィール帳に記録し、それぞれの基準を数値で採点して地図上の座標に配置する作業に似ています。この地図上では、意味が似ている単語ほど近い場所に配置されます。Bag of wordsが単語を独立した全く別のものとして扱うのに対し、Embeddingは単語同士の関係性や意味の近さを数値として保持できる点が最大の特徴です。
3つの文章を用いた変換の具体例
Embeddingが文章をどのように捉えるのかを理解するために、以下の3つの文章を再度確認します。
文章1:私は猫が好きです。
文章2:私は犬が好きです。
文章3:猫と犬が好きです。
単語の座標化による意味の表現
Bag of wordsの解説では、「猫」と「犬」は完全に別の単語として扱われました。しかしEmbeddingの技術を用いると、大量のテキストデータを学習したコンピューターは、「猫」と「犬」がどちらもペットとして飼われる動物であるという性質を学習します。
その結果、「猫」と「犬」の2つの単語は、数値化された空間座標において非常に近い位置に配置されます。例えば、「動物らしさ」や「人間との親しさ」といった複数の数値の組み合わせが、両者で似通った値になるためです。
文章同士の類似度の判定
単語ごとの座標データをもとに文章全体の数値を計算すると、コンピューターは文章の意味を比較できるようになります。
文章1(私は猫が好きです)と文章2(私は犬が好きです)を比較した場合、異なる部分は「猫」と「犬」のみです。Embeddingの空間座標において「猫」と「犬」は非常に近い位置にあるため、文章1と文章2の文章全体としての数値データも非常に近い値になります。
これにより、コンピューターは文章1と文章2が「動物を好意的に思っている」という非常に似た意味を持つ文章であると数学的に判定することが可能になります。文章3(猫と犬が好きです)についても、同じ動物グループに対する好意を示す文章として、高い関連性を見出すことができます。
今回はプログラミング言語であるPythonを用いてその仕組みを再現します。本記事では、3つの文章を実際に数値のまとまりへ変換する基礎的なプログラムを提示し、コンピューターが文章の意味を計算する過程を解説します。
単語の座標化と辞書の定義
プログラムを作成するにあたり、まずは単語ごとに「動物らしさ」と「人間との親しさ」という2つの評価基準を設定し、2つの数値の組み合わせを座標として定義します。
解説を簡潔にするため、助詞(は、が、と)や助動詞(です)、句点(。)といった単語は計算から除外します。文章の意味を構成する中核となる名詞(私、猫、犬)と動詞(好き)のみを抽出し、あらかじめ手作業で数値を割り当てた辞書を作成します。
PythonによるEmbeddingの計算プログラム
抽出した単語の座標を足し合わせ、単語の数で割ることで平均値を算出するプログラムを記述します。単語の座標の平均値を求めることで、文章全体がどのような意味の方向性を持っているかを数値化できます。
# 単語の辞書と、それぞれの単語が持つ意味の座標(動物らしさ、人間との親しさ)
word_embeddings = {
"私": [0.1, 0.9],
"猫": [0.8, 0.2],
"犬": [0.9, 0.3],
"好き": [0.5, 0.8]
}
def calculate_sentence_vector(words):
vector_x = 0.0
vector_y = 0.0
for word in words:
if word in word_embeddings:
vector_x += word_embeddings[word][0]
vector_y += word_embeddings[word][1]
length = len(words)
return [vector_x / length, vector_y / length]
sentence1_words = ["私", "猫", "好き"]
sentence2_words = ["私", "犬", "好き"]
sentence3_words = ["猫", "犬", "好き"]
vector1 = calculate_sentence_vector(sentence1_words)
vector2 = calculate_sentence_vector(sentence2_words)
vector3 = calculate_sentence_vector(sentence3_words)
print("文章1の座標:", vector1)
print("文章2の座標:", vector2)
print("文章3の座標:", vector3)
<実行結果>
文章1の座標: [0.4666666666666666, 0.6333333333333334]
文章2の座標: [0.5, 0.6666666666666666]
文章3の座標: [0.7333333333333334, 0.43333333333333335]
プログラムを実行すると、文章1と文章2の算出された数値が非常に近い値になることが確認できます。単語が持つ固有の数値を平均化する処理を通して、コンピューターは文章同士の意味の近さを数学的に処理しています。
類似度を計算するための基本方程式
算出された文章の座標データ同士が、空間上でどれほど近い位置にあるかを正確に判定するためには、コサイン類似度と呼ばれる計算手法を用います。コサイン類似度は、2つの座標を結んだ直線がなす角度を計算することで、意味の方向性がどれだけ一致しているかを導き出す指標です。
数式内のAおよびBは、比較対象となる2つの文章の座標データを表します。計算結果は1に近いほど意味の方向性が似ており、マイナス1に近いほど意味が正反対であることを示します。
Embeddingのメリットとデメリット
単語の意味を座標として扱うEmbeddingの手法についてのメリットとデメリットは以下の通りです。
メリット
- 単語同士の意味の近さを計算できるため、全く同じ単語が使われていなくても、類義語を含む文章を似た意味の文章として正確に処理することが可能になる。
- 扱う単語の種類が増えても、あらかじめ決められた数の座標データに圧縮されるため、Bag of wordsのようにデータが膨大になることを防ぎ、計算処理の効率が向上する。
デメリット
- 単語の適切な座標を決定するためには、事前の学習処理に膨大な量のテキストデータと計算資源が必要となる。
- 算出された数値の羅列自体はコンピューター向けのデータであり、人間が見ても直感的な意味を持たないため、なぜその数値になったのかという結果の解釈が困難である。
まとめ
Embeddingは、単語を意味を持つ空間座標として数値化し、文章の類似性や文脈を高度に捉えるための自然言語処理技術です。
学習のステップとして、まずは単語が複数の数値の組み合わせで表現される概念を理解し、手作業で「車」や「自転車」といったいくつかの単語に架空の数値を割り振って類似度を比較する作業を行ってみてください。次に、Word2Vecなどの既存の学習済みモデルをプログラムに読み込み、実際の単語同士の類似度をコンピューターに計算させる手順へ進み、自然言語処理の応用技術に対する理解を深めることをお勧めします。
セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。
投稿者プロフィール

- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。
最新の投稿
新人エンジニア研修講師2026年3月28日Bag of wordsとGPTによる文章分析の違いと文脈理解の比較
新人エンジニア研修講師2026年3月28日BERTを用いた文脈理解の仕組みと文章比較の具体例
新人エンジニア研修講師2026年3月28日Embedding(単語の埋め込み)による文章の意味の数値化と類似度計算
新人エンジニア研修講師2026年3月28日Bag of wordsを用いた文章の数値化手法と具体例
