Maison  >  Article  >  développement back-end  >  Comment puis-je calculer la similarité cosinus entre deux phrases sans utiliser de bibliothèques externes ?

Comment puis-je calculer la similarité cosinus entre deux phrases sans utiliser de bibliothèques externes ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-01 08:20:30839parcourir

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

Calcul de la similarité cosinus pour les chaînes de phrases

La similarité cosinus est une mesure de la corrélation entre deux vecteurs. Dans le cadre du traitement de texte, il peut être utilisé pour déterminer la similitude entre deux phrases. Pour calculer la similarité cosinus pour deux chaînes sans bibliothèques externes, suivez ces étapes :

  1. Tokeniser les chaînes : Divisez chaque chaîne en mots individuels, appelés jetons.
  2. Créer des vecteurs de mots : Pour chaque chaîne, créez un dictionnaire (vecteur) où les clés sont des mots uniques et les valeurs sont les fréquences de ces mots.
  3. Calculer le produit scalaire : Calculez le produit scalaire des deux vecteurs en additionnant les produits des éléments correspondants.
  4. Calculez les grandeurs : Trouvez la grandeur de chaque vecteur en mettant au carré et en additionnant tous ses éléments, puis en prenant la racine carrée.
  5. Normaliser : Divisez le produit scalaire par le produit des grandeurs pour obtenir la similarité cosinus normalisée.

Une implémentation Python simple :

<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>

Exemple d'utilisation :

<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>

Sortie :

Cosine: 0.861640436855

Notez que cette implémentation n'inclut pas la pondération TF-IDF, ce qui peut améliorer la précision de similarité cosinus pour des ensembles de données plus grands.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn