Open In App

How to Find Similar Sentences/Phrases in R?

Last Updated : 23 Jul, 2025
Comments
Improve
Suggest changes
Like Article
Like
Report

Identifying similar sentences or phrases within a text corpus is a common task in natural language processing (NLP) and text mining. This problem has numerous applications, including information retrieval, plagiarism detection, text summarization, and recommendation systems. In this article, we will explore various methods for finding similar sentences or phrases in R Programming Language.

How to Find Similar Sentences?

To find similar sentences or phrases, we need to quantify the similarity between two text entities. There are several methods to do this, ranging from simple lexical approaches to more advanced semantic techniques:

  1. Lexical Similarity:
    • Jaccard Similarity: Measures the similarity between two sets by dividing the size of the intersection by the size of the union. Applied to text, it compares the set of words in two sentences.
    • Cosine Similarity: Measures the cosine of the angle between two vectors in a multi-dimensional space. For text, the vectors are typically created using term frequency or TF-IDF (Term Frequency-Inverse Document Frequency) values.
    • Edit Distance (Levenshtein Distance): Counts the minimum number of single-character edits required to change one sentence into another.
  2. Semantic Similarity:
    • Word Embeddings: Words are represented as dense vectors (e.g., Word2Vec, GloVe), and the similarity between sentences is computed by averaging the vectors of the words in each sentence.
    • Sentence Embeddings: Sentences are directly represented as vectors, capturing the semantic meaning (e.g., using BERT, Universal Sentence Encoder).

Now we will discuss step by step How to Find Similar Sentences/Phrases in R Programming Language.

Example 1: Lexical Similarity using Jaccard and Cosine Similarity

First, we'll start with a simple lexical approach using the text2vec and tm packages.

Step 1: Install and Load Required Packages

First we will Install and Load Required Packages.

R
install.packages("text2vec")
install.packages("tm")
install.packages("stringdist")
library(text2vec)
library(tm)
library(stringdist)

Step 2: Prepare the Data

Suppose we have the following two sentences:

R
sentence1 <- "The quick brown fox jumps over the lazy dog"
sentence2 <- "A quick brown dog outpaces a lazy fox"

Step 3: Compute Jaccard Similarity

We can compute the Jaccard Similarity by tokenizing the sentences into words and comparing the sets:

R
tokens1 <- unique(unlist(strsplit(tolower(sentence1), " ")))
tokens2 <- unique(unlist(strsplit(tolower(sentence2), " ")))

jaccard_sim <- length(intersect(tokens1, tokens2)) / length(union(tokens1, tokens2))
jaccard_sim

Output:

[1] 0.5

Step 4: Compute Cosine Similarity

Cosine Similarity can be calculated by vectorizing the sentences using term frequency (TF) and then computing the cosine of the angle between the vectors:

R
corpus <- Corpus(VectorSource(c(sentence1, sentence2)))
tdm <- TermDocumentMatrix(corpus)
tdm_matrix <- as.matrix(tdm)
cosine_sim <- sim2(tdm_matrix, method = "cosine")[1,2]
cosine_sim

Output:

[1] 1

Example 2: Semantic Similarity using Pre-trained Word Embeddings

Since text2vec doesn’t provide a direct function to load pre-trained word vectors, you can use other methods, such as the word2vec package or pre-trained embeddings available online.

R
library(text2vec)
library(Matrix)
library(slam)

# Download and read the GloVe vectors (assuming you have downloaded glove.6B.50d.txt)
glove_model <- fread("glove.6B.50d.txt", header = FALSE, quote = "", data.table = FALSE)
word_vectors <- as.data.frame(glove_model, stringsAsFactors = FALSE)
colnames(word_vectors) <- c("word", paste0("V", 1:50))
word_vectors_matrix <- as.matrix(word_vectors[, -1])
rownames(word_vectors_matrix) <- word_vectors$word
sentence1 <- "The quick brown fox jumps over the lazy dog"
sentence2 <- "A quick brown dog outpaces a lazy fox"

tokens1 <- unlist(strsplit(tolower(sentence1), " "))
tokens2 <- unlist(strsplit(tolower(sentence2), " "))

# Compute sentence vectors by averaging word vectors
sentence_vec1 <- rowMeans(word_vectors_matrix[tokens1, , drop = FALSE], na.rm = TRUE)
sentence_vec2 <- rowMeans(word_vectors_matrix[tokens2, , drop = FALSE], na.rm = TRUE)

# Compute cosine similarity
cosine_similarity <- function(vec1, vec2) {
  sum(vec1 * vec2) / (sqrt(sum(vec1^2)) * sqrt(sum(vec2^2)))
}

cosine_sim <- cosine_similarity(sentence_vec1, sentence_vec2)
cosine_sim

Output:

[1] 0.826
  • The glove.6B.50d.txt file contains pre-trained word vectors. Each line represents a word followed by its vector components.
  • We load this file and convert it into a matrix where rows are words and columns are vector dimensions.
  • Tokenize sentences into words.
  • For each word in the sentences, look up its vector in the GloVe model.
  • Compute the average vector for the entire sentence.
  • The cosine similarity between two vectors measures the cosine of the angle between them. It ranges from -1 (exactly opposite) to 1 (exactly the same), with 0 indicating orthogonality (no similarity).

Conclusion

Finding similar sentences or phrases in R involves a variety of approaches depending on the desired level of similarity—whether lexical or semantic. Lexical methods like Jaccard and Cosine Similarity are easier to implement and understand but may miss deeper semantic meanings. On the other hand, semantic methods like word embeddings and sentence embeddings can capture the context and meaning of sentences more effectively but require more computational resources and understanding of NLP models.


Article Tags :

Similar Reads