ホームページ  >  記事  >  バックエンド開発  >  外部ライブラリを使用せずに 2 つの文間のコサイン類似度を計算するにはどうすればよいでしょうか?

外部ライブラリを使用せずに 2 つの文間のコサイン類似度を計算するにはどうすればよいでしょうか?

DDD
DDDオリジナル
2024-11-01 13:14:02753ブラウズ

How Can You Calculate Cosine Similarity Between Two Sentences Without External Libraries?

外部ライブラリを使用しない 2 つの文文字列間のコサイン類似度の計算

自然言語処理のコンテキストでは、コサイン類似度の計算は、ドキュメント間のテキストの類似性を測定するために不可欠です。 tf-idf-cosine などの外部ライブラリを使用するとこのタスクが容易になりますが、そのような依存関係に依存せずにコサイン類似度を手動で計算することも可能です。

コサイン類似度の概要

Cosine類似性は、テキストを表す 2 つのベクトル間の角度を定量化します。コサイン類似度が高いほど角度が小さいことを示し、テキスト間の類似性が高いことを意味します。これは、正規化されたベクトルのドット積をその大きさで割った値を使用して計算されます。

コサイン類似度の手動実装

コサイン類似度を手動で計算するには、次の手順を定義します。

  1. トークン化: 文を個々の単語に分割します。
  2. ベクトル化: 各文の単語ごとにカウンターを作成します。その頻度 (項頻度)。
  3. 正規化: 各要素をその要素の二乗和の平方根で除算してベクトルを正規化します (L2 ノルム)。
  4. コサイン計算: 正規化されたベクトルのドット積を計算し、その大きさで割ります。

コードの実装

以下は手動コサイン類似度計算の Python 実装:

<code class="python">import math
import re
from collections import Counter

WORD = re.compile(r"\w+")

def get_cosine(vec1, vec2):
    intersection = set(vec1.keys()) & set(vec2.keys())
    numerator = sum([vec1[x] * vec2[x] for x in intersection])
    
    sum1 = sum([vec1[x] ** 2 for x in vec1])
    sum2 = sum([vec2[x] ** 2 for x in vec2])
    denominator = math.sqrt(sum1) * math.sqrt(sum2)
    
    if not denominator:
        return 0.0
    else:
        return numerator / denominator

def text_to_vector(text):
    words = WORD.findall(text)
    return Counter(words)

text1 = "This is a foo bar sentence ."
text2 = "This sentence is similar to a foo bar sentence ."

vector1 = text_to_vector(text1)
vector2 = text_to_vector(text2)

cosine = get_cosine(vector1, vector2)

print("Cosine:", cosine)</code>

Result

このコードは次のように実行されます:

Cosine: 0.861640436855

この値は次のことを示します2 つの文間のコサイン類似度が高く、テキスト的に類似していることが確認されます。

さらなる考慮事項

この手動アプローチは基本的な実装を提供しますが、次の方法で強化できます。 :

  • 単語の正規化を改善するためのステミングまたは見出し語化の組み込み。
  • より洗練されたトークン化スキームの実装。
  • より正確な類似度計算のための TF-IDF などの重み付けの追加。

以上が外部ライブラリを使用せずに 2 つの文間のコサイン類似度を計算するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。