【0から学ぶAI】第258回:コサイン類似度による文章比較

目次

前回のおさらいと今回のテーマ

こんにちは!前回は、ネームドエンティティ認識(NER)について解説しました。NERはテキスト中の固有名詞を抽出し、その種類を分類する技術であり、情報抽出や検索エンジンの改善など、さまざまな応用があります。

今回は、コサイン類似度を使ったテキスト間の類似度計算について解説します。コサイン類似度は、テキストデータを数値ベクトルに変換し、その類似性を測る方法であり、文章のクエリ検索や重複検出、ドキュメントクラスタリングなどに広く利用されています。この記事では、コサイン類似度の基本概念と計算方法、具体的な実装例を紹介します。

コサイン類似度とは?

1. コサイン類似度の基本概念

コサイン類似度(Cosine Similarity)は、2つのベクトルの間の角度のコサイン値を用いて、類似度を測る手法です。数学的には、2つのベクトルがなす角度が小さいほど類似度が高く、90度の角度を持つベクトルは類似していないと見なされます。

コサイン類似度は、次の式で計算されます。

[
\text{Cosine Similarity} = \frac{\mathbf{A} \cdot \mathbf{B}}{|\mathbf{A}| |\mathbf{B}|}
]

ここで、

  • ( \mathbf{A} \cdot \mathbf{B} ) はベクトルAとベクトルBの内積。
  • ( |\mathbf{A}| ) と ( |\mathbf{B}| ) はベクトルAとBのノルム(長さ)です。

コサイン類似度の値は、-1から1の範囲で表されます。1に近いほど2つのベクトルは似ており、0に近いほど無関係、-1に近いほど反対方向に向いていることを意味します。

2. 文章比較におけるコサイン類似度の適用

コサイン類似度は、テキストデータを数値ベクトルに変換することで、文章間の類似度を測るために使用されます。テキストデータはまずベクトル表現(例:TF-IDFや単語埋め込み)に変換され、その後にコサイン類似度を計算します。

文章ベクトル化の手法

コサイン類似度を使って文章の類似度を計算するためには、まずテキストを数値ベクトルに変換する必要があります。一般的な方法は以下の通りです。

1. Bag-of-Words(BoW)

Bag-of-Wordsは、文章中の単語の出現回数をベクトル化するシンプルな方法です。各次元が特定の単語の出現頻度を示すベクトルとして表現します。しかし、BoWは単語の意味や順序を考慮しないため、意味的な類似度を正確に捉えにくい場合があります。

2. TF-IDF(Term Frequency-Inverse Document Frequency)

TF-IDFは、単語の出現頻度(TF)と逆文書頻度(IDF)を組み合わせて単語の重要度を評価する手法です。頻繁に出現する単語には低い重みを与え、まれに出現する単語には高い重みを与えることで、より意味のある特徴を抽出します。

3. 単語埋め込み(Word Embedding)

単語埋め込みは、Word2VecやGloVe、BERTなどのモデルを用いて、単語を意味的な関係を反映したベクトルに変換する手法です。文全体のベクトルは、各単語のベクトルの平均や加算によって得ることができます。

コサイン類似度による文章比較の実装

ここでは、Pythonのscikit-learnライブラリを使用して、TF-IDFを用いた文章のコサイン類似度計算の実装例を紹介します。

1. 必要なライブラリのインストール

まず、必要なライブラリをインストールします。

pip install scikit-learn

2. コサイン類似度の計算

以下のコードでは、TF-IDFを用いてテキストをベクトル化し、その後コサイン類似度を計算します。

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# サンプル文章
documents = [
    "I love machine learning. It's amazing.",
    "Machine learning is a fascinating field.",
    "I enjoy doing natural language processing.",
    "Natural language processing is a challenging and exciting field."
]

# TF-IDFベクトライザの初期化
vectorizer = TfidfVectorizer()

# 文章のベクトル化
tfidf_matrix = vectorizer.fit_transform(documents)

# コサイン類似度の計算
cosine_sim = cosine_similarity(tfidf_matrix, tfidf_matrix)

# 結果の表示
print("Cosine Similarity Matrix:")
print(cosine_sim)

このコードは、4つのサンプル文章をTF-IDFベクトルに変換し、それらの間のコサイン類似度を計算しています。cosine_sim行列の各要素は、対応する2つの文章間の類似度を示します。

3. 特定の文章との類似度を計算

特定の文章と他の文章との類似度を計算することも可能です。例えば、最初の文章と他のすべての文章の類似度を表示するコードは次のようになります。

# 最初の文章との類似度
similarities = cosine_sim[0]

# 結果の表示
for idx, score in enumerate(similarities):
    print(f"Document 0 vs Document {idx}: Similarity = {score:.2f}")

このコードは、最初の文章(インデックス0)と他のすべての文章とのコサイン類似度を計算し、その結果を表示します。

コサイン類似度の応用例

1. 文書検索

コサイン類似度は、検索クエリとドキュメント間の類似度を計算することで、検索エンジンの結果をランク付けするのに使用されます。クエリに最も類似したドキュメントを見つけるために役立ちます。

2. 重複検出

類似したドキュメントやコピーされたコンテンツを検出するために、コサイン類似度を使用します。例えば、ニュース記事の内容が他のソースとどの程度重複しているかを確認することができます。

3. クラスタリング

コサイン類似度を利用して、ドキュメントをクラスタリングすることが可能です。類似した内容を持つドキュメントをまとめることで、大量のテキストデータを効率的に整理できます。

コサイン類似度の課題と改善方法

1. 単語の意味を考慮しない

TF-IDFやBoWを用いる場合、単語の意味的な関係を考慮しません。そのため、意味は同じでも異なる単語が使われた場合、低い類似度になる可能性があります。これを改善するために、Word EmbeddingBERTを用いたベクトル化が効果的です。

2. 長い文章の影響

文章が長いと、重要な単語が埋もれてしまうことがあります。TF-IDFでは、長い文章で出現頻度の高い単語が重視されるため、重要な情報が反映されにくくなることがあります。この問題に対処するために、重み付け文脈依存のモデルを導入することが有効です。

まとめ

今回は、コサイン類似度による文章比較について、その基本概念と実装方法を解説しました。コサイン類似度は、テキストデータを数値ベクトルに変換

して類似度を測るシンプルで効果的な手法です。ドキュメント検索や重複検出、クラスタリングなど、多くのNLPタスクで役立つ技術です。

次回予告

次回は、シソーラスとWordNetについて解説します。これらは単語の関係性を捉えるリソースで、意味的なつながりを理解するために役立ちます。お楽しみに!


注釈

  1. TF-IDF:単語の出現頻度と逆文書頻度を掛け合わせて、その単語が文章内でどれだけ重要かを評価する手法。
  2. BoW(Bag-of-Words):文章中の単語の出現回数をベクトル化する手法で、単語の順序や文脈を考慮しない。
  3. Word Embedding:単語を意味的な関係を反映したベクトルに変換する手法で、語彙の意味を捉えることができる。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社PROMPTは生成AIに関する様々な情報を発信しています。
記事にしてほしいテーマや調べてほしいテーマがあればお問合せフォームからご連絡ください。
---
PROMPT Inc. provides a variety of information related to generative AI.
If there is a topic you would like us to write an article about or research, please contact us using the inquiry form.

コメント

コメントする

目次