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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-01 08:20:30839ブラウズ

How can I calculate cosine similarity between two sentences without using external libraries?

文文字列のコサイン類似度の計算

コサイン類似度は、2 つのベクトル間の相関の尺度です。テキスト処理のコンテキストでは、2 つの文間の類似性を判断するために使用できます。外部ライブラリを使用せずに 2 つの文字列のコサイン類似度を計算するには、次の手順に従います。

  1. 文字列をトークン化します。 各文字列をトークンと呼ばれる個別の単語に分割します。
  2. 単語ベクトルの作成: 文字列ごとに、キーが一意の単語であり、値がそれらの単語の頻度である辞書 (ベクトル) を作成します。
  3. ドット積を計算します。 : 対応する要素の積を合計することで 2 つのベクトルのドット積を計算します。
  4. 大きさの計算: すべての要素を 2 乗して合計することで各ベクトルの大きさを見つけます。平方根を求めます。
  5. 正規化: ドット積を大きさの積で割って、正規化されたコサイン類似度を取得します。

簡単な 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 list(vec1.keys())])
    sum2 = sum([vec2[x] ** 2 for x in list(vec2.keys())])
    denominator = math.sqrt(sum1) * math.sqrt(sum2)

    if not denominator:
        return 0.0
    else:
        return float(numerator) / denominator

def text_to_vector(text):
    words = WORD.findall(text)
    return Counter(words)</code>

使用例:

<code class="python">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>

出力:

Cosine: 0.861640436855

この実装には、TF-IDF 重み付けが含まれていないことに注意してください。これにより、精度が向上します。より大きなデータセットのコサイン類似度。

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

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