Calcular semelhança de cosseno no Apache Spark

9

Eu tenho um DataFrame com IDF de determinadas palavras computadas. Por exemplo

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



 .... and so on

Agora, faça uma consulta Q, posso calcular o TF-IDF dessa consulta. Como faço para calcular a semelhança de cosseno da consulta com todos os documentos no quadro de dados (há quase um milhão de documentos)

Eu poderia fazê-lo manualmente em um trabalho de redução de mapa usando a multiplicação de vetores

Semelhança de cosseno (Q, documento) = Produto escalar (Q, documento) / || Q || * || documento ||

mas certamente o Spark ML deve suportar nativamente o cálculo da similaridade de cosseno de um texto?

Em outras palavras, com uma consulta de pesquisa, como encontro os cossenos mais próximos do documento TF-IDF do DataFrame?

Ganesh Krishnan
fonte
3
Você pode usar o Normalizador do Spark e, se estiver interessado em "similaridade de todos os pares", DIMSUM .
Emre

Respostas:

8

Há um exemplo relacionado ao seu problema no repositório Spark aqui . A estratégia é representar os documentos como um RowMatrix e, em seguida, usar seu método columnSimilarities (). Isso lhe dará uma matriz de todas as semelhanças de cosseno. Extraia a linha que corresponde ao seu documento de consulta e classifique. Isso fornecerá os índices dos documentos mais semelhantes.

Dependendo da sua aplicação, todo esse trabalho pode ser feito antes da consulta.

Pete
fonte