Ruby - Similarity
Tags: ruby, tutorial, beginners, programming
Published: 2023-01-19 18:12:14

Existem várias maneiras de fazer comparação de similaridade entre strings em Ruby. Algumas das maneiras mais comuns incluem:

* **Levenshtein distance:** É uma medida da distância entre duas strings, baseada na quantidade mínima de operações (inserção, deleção ou substituição de um caractere) necessárias para transformar uma string em outra. A biblioteca `text` possui um método levenshtein_distance que pode ser usado para calcular a distância de Levenshtein entre duas strings.

* **Jaro-Winkler distance:** É uma medida da similaridade entre duas strings, baseada na quantidade de caracteres comuns nas primeiras posições das strings e na distância entre os caracteres comuns. A biblioteca `amatch` possui um método jaro_winkler que pode ser usado para calcular a distância de Jaro-Winkler entre duas strings.

* **Cosine similarity:** É uma medida da similaridade entre duas strings baseada no cosseno do ângulo entre vetores que representam as strings. A biblioteca `text-similarity` possui um método cosine_similarity que pode ser usado para calcular a similaridade cosseno entre duas strings.

* **Fuzzy matching:** É uma técnica de correspondência aproximada que permite comparar duas strings e encontrar similaridades, mesmo se elas não forem idênticas. A biblioteca `fuzzy_match` é uma boa opção para fazer correspondência fuzzy.

* **Shingling:** É uma técnica de comparação de strings baseada em dividir as strings em conjuntos de caracteres consecutivos (shingles) e comparando a presença desses conjuntos entre as strings. A biblioteca `shingles` é uma boa opção para fazer comparação de similaridade baseado em shingling.

Essas são algumas das maneiras mais comuns de fazer comparação de similaridade entre strings em Ruby, mas existem outras técnicas e bibliotecas disponíveis. É importante escolher a técnica e a biblioteca mais adequadas para o seu caso de uso específico.

A técnica mais utilizada para comparação de similaridade entre strings varia de acordo com o caso de uso específico e as necessidades do projeto.

A distância de Levenshtein é amplamente utilizada para a comparação de strings curtas e é uma boa escolha para casos onde a precisão é mais importante do que a velocidade de processamento.

A distância de Jaro-Winkler é amplamente utilizada para a comparação de strings de nomes e é uma boa escolha para casos onde as strings são similares mas não são idênticas.

A Similaridade Cosseno é amplamente utilizada para a comparação de strings longas e é uma boa escolha para casos onde se deseja comparar documentos inteiros e encontrar similaridades entre eles.

Fuzzy matching é amplamente utilizada para a comparação de strings quando a precisão não é tão importante e é uma boa escolha para casos onde as strings podem conter erros de digitação ou variações.

Shingling é amplamente utilizada para a comparação de strings longas e é uma boa escolha para casos onde se deseja comparar documentos inteiros e encontrar similaridades entre eles.

É importante notar que cada técnica tem suas próprias limitações e vantagens e a escolha da técnica certa dependerá do seu caso de uso específico.

## Exemplos

Para ficar mais ilustrativo aqui estão alguns exemplos de código Ruby que ilustram como calcular a similaridade entre strings usando as técnicas mencionadas anteriormente:

1. Levenshtein distance:

```ruby
require 'text'
string1 = "kitten"
string2 = "sitting"
distance = Text::Levenshtein.distance(string1, string2)
puts "The Levenshtein distance between '#{string1}' and '#{string2}' is #{distance}"

```

2. Jaro-Winkler distance:

```ruby
require 'amatch'
string1 = "DWAYNE"
string2 = "DUANE"
jaro = Amatch::Jaro.new(string1)
distance = jaro.match(string2)
puts "The Jaro-Winkler distance between '#{string1}' and '#{string2}' is #{distance}"
```

3. Cosine similarity:

```ruby
require 'text-similarity'
string1 = "This is a test"
string2 = "This is a trial"
cosine = TextSimilarity::CosineSimilarity.new
similarity = cosine.getSimilarity(string1, string2)
puts "The cosine similarity between '#{string1}' and '#{string2}' is #{similarity}"
```

4. Fuzzy matching:

```ruby
require 'fuzzy_match'
string1 = "fuzzy"
string2 = "fuzi"
fuzzy = FuzzyMatch.new([string1,string2])
match = fuzzy.find(string1)
puts "The fuzzy matching between '#{string1}' and '#{string2}' is #{match}"
```

5. Shingling:

```ruby
require 'shingles'
string1 = "This is a test"
string2 = "This is a trial"
shingle = Shingles::Shingle.new(string1)
shingle2 = Shingles::Shingle.new(string2)
jaccard_distance = shingle.distance(shingle2)
puts "The jaccard distance between '#{string1}' and '#{string2}' is #{jaccard_distance}"
```

### Considerações finais

Tenha em mente que esses são apenas exemplos básicos e você pode precisar personalizar esses códigos para atender às suas necessidades específicas. E também lembre-se de que essas bibliotecas podem ter dependências e precisam ser instaladas.