What is cosine similarity, and how is it useful for text embeddings?
Tags: ai, generativeai, llm, rag
Published: 2024-01-24 16:30:10

In natural language processing (NLP) and text analysis, cosine similarity stands as a fundamental concept with profound implications. Its significance lies in its ability to measure the semantic similarity between text documents, rendering it indispensable for various NLP tasks and applications. In this article, we will explore cosine similarity, with a practical example. By the end, you'll gain a clear understanding of why cosine similarity is a crucial tool for comparing and analyzing textual data in high-dimensional spaces, making it a cornerstone in the field of natural language processing.

Cosine similarity is important for text embeddings and natural language processing (NLP) tasks for several reasons:

- Cosine similarity measures the cosine of the angle between two vectors in a multi-dimensional space. When applied to text embeddings, these vectors represent the semantic meaning or content of text documents. Because it focuses on the direction rather than the magnitude of the vectors, cosine similarity is particularly useful for comparing the similarity of text documents without being affected by their length or scale.

- Text embeddings often result in high-dimensional vectors, especially when using techniques like word embeddings (e.g., Word2Vec, GloVe) or contextual embeddings (e.g., BERT, GPT). In high-dimensional spaces, Euclidean distance measures can become less effective due to the "curse of dimensionality," where the distance between points becomes less meaningful. Cosine similarity remains effective in high-dimensional spaces.

- Cosine similarity captures the semantic similarity between text documents. If two documents have similar meanings or topics, their cosine similarity will be high, regardless of the specific words or terms used. This is valuable for various NLP tasks, including information retrieval, document clustering, recommendation systems, and more.

- Cosine similarity is robust to noise and irrelevant terms in text documents. It focuses on the underlying structure of the text embeddings and is less affected by noise or unimportant words, making it suitable for real-world text data that often contains noise and irrelevant information.

- Cosine similarity has been widely adopted and used in various NLP applications and models. Many pre-trained word and sentence embeddings are designed to optimize cosine similarity as a measure of semantic similarity, making it a natural choice for compatibility with these embeddings.

- Cosine similarity scores are easily interpretable, ranging from -1 (perfectly dissimilar) to 1 (perfectly similar). This makes it easy to set similarity thresholds for various NLP tasks or to visualize and understand the relationships between text documents.

## Example

Let's consider a simple example of cosine similarity using two vectors representing text documents. In this example, we'll use the term frequency-inverse document frequency (TF-IDF) vectors, which are commonly used for text analysis.

Suppose we have two text documents:

Document 1: "I enjoy reading books."
Document 2: "I love reading novels."

We want to calculate the cosine similarity between the TF-IDF vectors of these two documents.

First, we need to convert these documents into TF-IDF vectors, which represent the importance of each word in the context of the entire corpus:

TF-IDF(Document 1):
- "I": 0.0 (since it appears in both documents)
- "enjoy": TF-IDF score (depends on the term's frequency and its rarity in the entire corpus)
- "reading": TF-IDF score
- "books": TF-IDF score
- "love": 0.0
- "novels": 0.0

TF-IDF(Document 2):
- "I": 0.0
- "enjoy": 0.0
- "reading": TF-IDF score
- "books": 0.0
- "love": TF-IDF score
- "novels": TF-IDF score

Now, we have two TF-IDF vectors:

TF-IDF Vector for Document 1: [0.0, TF-IDF(reading), TF-IDF(books), 0.0, 0.0, 0.0]
TF-IDF Vector for Document 2: [0.0, 0.0, TF-IDF(reading), 0.0, TF-IDF(love), TF-IDF(novels)]

To calculate the cosine similarity, we'll use the formula shown in the below image.

![Cosine similarity](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kl9bbmrpaqliekwwkrs3.png)

In this case, the dot product of the two TF-IDF vectors is the sum of the products of their corresponding components:

(Vector 1 · Vector 2) = (0.0 * 0.0) + (TF-IDF(reading) * 0.0) + (TF-IDF(books) * TF-IDF(reading)) + (0.0 * 0.0) + (0.0 * TF-IDF(love)) + (0.0 * TF-IDF(novels))

Since some terms have zero TF-IDF scores, the dot product simplifies, but the cosine similarity formula still applies. The magnitudes are calculated by taking the square root of the sum of squares of the vector components.

Once you have the values, you can calculate the cosine similarity, which will be a number between -1 and 1. The closer the cosine similarity is to 1, the more similar the documents are in terms of their content.

## Conclusion

In summary, cosine similarity is a fundamental and valuable metric for comparing the similarity of text documents, particularly in high-dimensional spaces where it remains effective and is robust to noise. It plays a crucial role in various NLP tasks and has become a standard similarity metric in the field.