Calculer la similitude du cosinus dans Apache Spark

9

J'ai un DataFrame avec IDF de certains mots calculés. Par exemple

(10,[0,1,2,3,4,5],[0.413734499590671,0.4244680552337798,0.4761400657781007, 1.4004620708967006,0.37876590175292424,0.48374466516332])



 .... and so on

Donnez maintenant une requête Q, je peux calculer le TF-IDF de cette requête. Comment calculer la similitude cosinus de la requête avec tous les documents dans la trame de données (il y a près de millions de documents)

Je pourrais le faire manuellement dans un travail de réduction de carte en utilisant la multiplication vectorielle

Similitude cosinus (Q, document) = Produit scalaire (Q, document) / || Q || * || document ||

mais sûrement Spark ML doit nativement supporter le calcul de la similitude cosinus d'un texte?

En d'autres termes, étant donné une requête de recherche, comment trouver les cosinus les plus proches du document TF-IDF à partir du DataFrame?

Ganesh Krishnan
la source
3
Vous pouvez utiliser le normalisateur de Spark et, si vous êtes intéressé par la "similitude toutes paires", DIMSUM .
Emre

Réponses:

8

Il y a un exemple lié à votre problème dans le référentiel Spark ici . La stratégie consiste à représenter les documents en tant que RowMatrix , puis à utiliser sa méthode columnSimilarities (). Cela vous donnera une matrice de toutes les similitudes de cosinus. Extrayez la ligne qui correspond à votre document de requête et triez. Cela donnera les indices des documents les plus similaires.

Selon votre application, tout ce travail peut être effectué avant la requête.

Pete
la source