Berechnen Sie die Kosinusähnlichkeit in Apache Spark

9

Ich habe einen DataFrame mit IDF bestimmter Wörter berechnet. Zum Beispiel

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



 .... and so on

Geben Sie nun eine Abfrage Q, ich kann die TF-IDF dieser Abfrage berechnen. Wie berechne ich die Kosinusähnlichkeit der Abfrage mit allen Dokumenten im Datenrahmen (es gibt fast eine Million Dokumente)?

Ich könnte es manuell in einem Job zur Kartenreduzierung tun, indem ich die Vektormultiplikation verwende

Kosinusähnlichkeit (Q, Dokument) = Punktprodukt (Q, Dokument) / || Q || * || Dokument ||

aber sicherlich muss Spark ML die Berechnung der Kosinusähnlichkeit eines Textes von Haus aus unterstützen?

Mit anderen Worten, wenn ich eine Suchabfrage habe, wie finde ich die nächsten Cosinus des Dokuments TF-IDF aus dem DataFrame?

Ganesh Krishnan
quelle
3
Sie können den Normalizer von Spark und, wenn Sie an "Ähnlichkeit aller Paare" interessiert sind, DIMSUM verwenden .
Emre

Antworten:

8

Es gibt ein ähnliches Beispiel für Ihr Problem in dem Spark - Repo hier . Die Strategie besteht darin, die Dokumente als RowMatrix darzustellen und dann die columnSimilarities () -Methode zu verwenden. Dadurch erhalten Sie eine Matrix aller Kosinusähnlichkeiten. Extrahieren Sie die Zeile, die Ihrem Abfragedokument entspricht, und sortieren Sie sie. Das gibt die Indizes der ähnlichsten Dokumente.

Abhängig von Ihrer Anwendung kann all diese Arbeit vor der Abfrage ausgeführt werden.

Pete
quelle