sparknlp.annotator.similarity.pairwise_vector_similarity#
Contains class for PairwiseVectorSimilarity.
Module Contents#
Classes#
Computes pairwise vector similarity between two sets of sentence embeddings. |
- class PairwiseVectorSimilarity(classname='com.johnsnowlabs.nlp.annotators.similarity.PairwiseVectorSimilarity', java_model=None)[source]#
Computes pairwise vector similarity between two sets of sentence embeddings.
Takes two
SENTENCE_EMBEDDINGSinput columns (e.g. query embeddings and document embeddings already joined on the same row) and scores all N×M pairs between the embeddings in column A and the embeddings in column B. Each pair produces oneVECTOR_SIMILARITYoutput annotation whoseresultholds the score as a string, and whosemetadatacontains typed fields for easy extraction.Sign conventions
Method
Range
Higher means
cosine
[-1.0, 1.0]
more similar
dotProduct
(−∞, +∞)
more similar
euclidean
(−∞, 0.0]
more similar (0.0 = identical vectors)
The
euclideanmethod returns the negative L2 distance so that “higher is better” holds uniformly across all three methods. A score of0.0means the two vectors are identical.Important: input data shape
Each input column should contain exactly one embedding per row for standard document retrieval. If a column contains N > 1 embeddings (e.g. from
SentenceDetector+ embedder), all N×M cross-pairs are scored and returned as separate annotations.To compare queries against a corpus, crossJoin them first so each row holds one (query, document) pair:
Input Annotation types
Output Annotation type
SENTENCE_EMBEDDINGSVECTOR_SIMILARITYSENTENCE_EMBEDDINGS- Parameters:
- similarityMethod
Similarity function:
"cosine"(default),"dotProduct", or"euclidean"(negative L2 distance).
Examples
>>> from sparknlp.annotator import PairwiseVectorSimilarity >>> from pyspark.sql.functions import col, explode, desc
>>> # Assume embedding_pipeline produces a "embeddings" SENTENCE_EMBEDDINGS column. >>> query_df = embedding_pipeline.transform(queries).select(col("embeddings").alias("query_emb")) >>> corpus_df = embedding_pipeline.transform(corpus).select(col("embeddings").alias("doc_emb"), col("id")) >>> paired = query_df.crossJoin(corpus_df)
>>> pvs = PairwiseVectorSimilarity() \ ... .setInputCols(["query_emb", "doc_emb"]) \ ... .setOutputCol("similarity") \ ... .setSimilarityMethod("cosine")
>>> result = pvs.transform(paired) \ ... .select(explode(col("similarity")).alias("s")) \ ... .select( ... col("s.metadata")["sentence_a_text"].alias("query"), ... col("s.metadata")["sentence_b_text"].alias("document"), ... col("s.result").cast("double").alias("score")) \ ... .orderBy(desc("score")) >>> result.show(truncate=False)