はじめに:コンピューターは「言葉」をどう扱う?
私たち人間が普段使っている言葉を、コンピューターが理解し、処理する技術を自然言語処理(NLP)と呼びます。しかし、コンピューターは「猫」や「犬」といった単語をそのままでは理解できません。コンピューターが扱えるのは数値データだけです。
そこで必要になるのが、単語を数値のベクトル(数字の列)に変換する処理です。この単語のベクトル化手法の基本となる考え方の一つが、今回解説する「局所表現」です。
局所表現とは?
局所表現(Local Representation)とは、それぞれの単語を互いに独立した、個別の記号として表現する手法です。 最も代表的な手法に「One-hot表現(one-hot encoding)」があります。
この方法では、単語同士の意味の近さや関連性は考慮されません。 例えば、「りんご」と「みかん」はどちらも果物ですが、局所表現ではそれらの関係性は全く表現されず、単に別々の単語として扱われます。
代表的な手法:One-hot表現
One-hot表現は、局所表現の中で最もシンプルで分かりやすい手法です。 これは、語彙(扱う単語の全リスト)の中から、一つの単語に対応する要素だけを「1」にし、残りをすべて「0」にするベクトルで単語を表現する方法です。
例えば、私たちの語彙リストが「猫」「犬」「鳥」「魚」の4つだけだとしましょう。この場合、各単語は以下のように4次元のベクトルで表現されます。
- 猫:
- 犬:
- 鳥:
- 魚:
このように、ベクトルの中の「1」が立っている(Hotになっている)場所が一つだけなので、「One-hot」と呼ばれます。
Pythonでの簡単な例
機械学習ライブラリのscikit-learnを使うと、簡単にOne-hot表現を作成できます。
from sklearn.preprocessing import OneHotEncoder
import numpy as np
# 語彙リスト
words = [['猫'], ['犬'], ['鳥'], ['魚'], ['犬']]
# OneHotEncoderのインスタンスを作成
encoder = OneHotEncoder(sparse_output=False)
# エンコーダーを学習させ、データを変換
one_hot_vectors = encoder.fit_transform(words)
print("--- 各単語のOne-hot表現 ---")
print(one_hot_vectors)
print("\n--- 語彙の確認 ---")
print(encoder.categories_)
上記のコードは、語彙リストを学習し、それぞれの単語に対応するOne-hotベクトルを生成します。
メリットとデメリット
One-hot表現には、そのシンプルさゆえの長所と短所があります。
メリット | デメリット |
---|---|
|
|
局所表現の先へ:分散表現の登場
局所表現、特にOne-hot表現の「単語の意味を捉えられない」「次元が大きくなりすぎる」といった課題を克服するために生まれたのが「分散表現」という考え方です。
分散表現は、単語を低次元で密な(0の要素が少ない)ベクトルで表現します。 このベクトルでは、意味が近い単語はベクトル空間上で近くに配置されるようになります。 例えば、「王様」-「男性」+「女性」を計算すると「女王様」に近いベクトルが得られる、といった単語の意味の演算も可能になります。
この分散表現を実現する代表的な手法として、2013年頃に提案されたWord2Vecなどがあり、現代の自然言語処理技術の根幹をなしています。
まとめ
局所表現は、自然言語処理の歴史における基本的な一歩です。この考え方を理解することは、より高度な技術である分散表現を学ぶ上で非常に重要となります。