Jellyfish y la distancia entre textos

Contenido del Bootcamp Dirigido por: | Última modificación: 12 de abril de 2024 | Tiempo de Lectura: 3 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

En este artículo te hablaremos de la relación que existe entre Jellyfish y la distancia entre textos.

Jellyfish es una librería que contiene funciones para cálculo de similitud entre textos. Dicha similitud puede ser a nivel lexicográfico (strings) o a nivel fonético.

Algoritmos relacionados con Jellyfish y la distancia entre textos

Algoritmos de comparación de strings

  • Levenshtein distance.
  • Damerau – Levenshtein distance.
  • Jaro distance.
  • Jaro – Winkler distance.
  • Match rating approach comparison.
  • Hamming distance.

Algoritmos de encoding fonético

  • American soundex.
  • Metaphone.
  • NYSIIS (New York State Identification and Intelligence System).
  • Match rating codex.

Funcionamiento de Jellyfish y la distancia entre textos

#Jellyfish y la distancia entre textos
! pip instal jellyfish
import jellyfish

Distancia Levenshtein

Esta es la distancia de edición en la que las operaciones permitidas son la inserción, eliminación y sustitución.

#Jellyfish y la distancia entre textos
jellyfish.levenshtein_distance ('Cisne negro', 'Cisne negro')

0

jellyfish.levenshtein_distance ('Cisne negro', 'Cisne negor')

2 (dos transmutaciones)

#Jellyfish y la distancia entre textos
jellyfish.levenshtein_distance ('Cisne negro', 'Cisne nego')

1

jellyfish.levenshtein_distance ('Cisnee negro', 'Cisne nego')

2

#Jellyfish y la distancia entre textos
jellyfish.levenshtein_distance ('Cisneee negro', 'Cisne nego')

3

Distancia Damerau – Levenshtein

Distancia de edición en la que las operaciones permitidas son la inserción, la eliminación y la transposición de 2 caracteres adyacentes.

#Jellyfish y la distancia entre textos
jellyfish.damerau_levenshtein_distance ('Cisne negro', 'Cisne negro')

0

jellyfish.damerau_levenshtein_distance ('Cisne negro', 'Cisne negor')

1

#Jellyfish y la distancia entre textos
jellyfish.damerau_levenshtein_distance ('Cisne negro', 'Cisne nego')

1

jellyfish.damerau_levenshtein_distance ('Cisnee negro', 'Cisne nego')

2

#Jellyfish y la distancia entre textos
jellyfish.damerau_levenshtein_distance ('Cisneee negro', 'Cisne nego')

3

Jaro distance

Distancia de edición en la que la operación permitida es la transposición. El resultado son probabilidades:

#Jellyfish y la distancia entre textos
jellyfish.jaro_distance ('Cisne negro', 'Cisne negro')

0.9696969696969697

jellyfish.damerau_levenshtein_distance ('Cisnee negro', 'Cisne nego')

0.9111111111111111

#Jellyfish y la distancia entre textos
jellyfish.damerau_levenshtein_distance ('Cisneee negro', 'Cisne nego')

0.8897435897435897

Phonetic matching

El algoritmo metaphone permite codificar fonéticamente palabras en inglés en 16 posibles sonidos.

Jellyfish y la distancia entre textos

Vamos a crear una serie de datos de nombres de chicas y chicos:

boy_names = [  ]
girl_names = [  ]

with open ('./datsets/boys.txt', 'r', encoding = 'utf - 8') as f:
         boy_names += [l.strip () for l in f]

with open ('./datsets/girls.txt', 'r', encoding = 'utf - 8') as f:
         girl_names += [l.strip () for l in f]
boy_names [:10]

[‘Liam’,

‘Noah’,

‘William’,

‘James’,

‘Logan’,

‘Benjamin’,

‘Mason’,

‘Elijah’,

‘Oliver’,

‘Jacob’]

girl_names [:10]

[‘Emma’,

‘Olivia’,

‘Ava’,

‘Isabella’,

‘Sophia’,

‘Mia’,

‘Charlotte’,

‘Amelia’,

‘Evelyn’,

‘Abigail’]

Vamos a juntarlos todos:

names = boy_names + girl_names

Con la librería de Jellyfish, obtendremos la representación fonética a través del uso de metaphone:

metaphone = [jellyfish.metaphone (n) for n in names]
import numpy as np
from operator import itemgetter
print ('{0 : 10} {1 : 10}'.format ('Name', 'Metaphone representation'))
for i in np.random.choice (len (names), 10):
      print ('{0 : 10} {1 : 10}'.format (names [i], metaphone [i]))
NameMetaphone representation
KoaK
CasenKSN
AdelaideATLT
DominikTMNK
TessaTS
KimoraKMR
BrodyBRT
JulianaJLN
JuliaJL
JessieJS

A partir de esta representación fonética podemos establecer la distancia que hay entre un nombre y otro:

def phon_distance_all (dataset, candidate, distance, phon):
       ' ' ' Phonetich distance to all the names in the list ' ' '
      return {dataset [i]: distance (phon [i], phon [candidate]) for i in range (len (dataset))}
name = names [1000]
print (name)

Emma

#Buscamos los más cercanos
dall = phon_distance_all (names, 1000, jellyfish.levenshtein_distance, metaphone)

sorted (dall.items (), key = itemgetter (1), reverse = False) [:50]

[(‘Emma’, 0),

(‘Emmy’, 0),

(‘Emmie’, 0),

(‘Liam’, 1),

(‘Eli’, 1),

(‘Emmet’, 1),

(‘Emilio’, 1),

(‘Romeo’, 1),

(‘Remy’, 1),

(‘Jaime’, 1),

(‘Emmitt’, 1),

(‘Sam’, 1),

(‘Jimmy’, 1),

(‘Eddie’, 1),

(‘Tommy’, 1),

(‘Chaim’, 1),

(‘Jamie’, 1),

(‘Emery’, 1),

(‘Emory’, 1),

(‘Emmet’, 2),

(‘Mia’, 1),

(‘Emily’, 1),

(‘Ella’, 1),

(‘Ellie’, 1),

(‘Naomi’, 1),

(‘Eva’, 1),

(‘Emilia’, 1),

(‘Amy’, 1),

(‘Remi’, 1),

(‘Gemma’, 1),

(‘Evie’, 1),

(‘Elle’, 1),

(‘Emely’, 1),

(‘Eve’, 1),

(‘Demi’, 1),

(‘Maia’, 1),

(‘Emelia’, 1),

(‘Esme’, 1),

(‘Jemma’, 1),

(‘Mae’, 1),

(‘Emerie’, 1),

(‘Noemi’, 1),

(‘Miah’, 1),

(‘Emilee’, 1),

(‘Amia’, 1),

(‘Noah’, 2),

(‘William’, 2),

(‘James’, 2),

(‘Elijah’, 2),

(‘Ethan’, 2),]

Vemos que las representaciones fonéticas que más se parecen son Emma, Emmy y Emmie, cuya distancia es de 0.

¿Quieres seguir avanzando?

Ya sabes cómo funciona Jellyfish y la distancia entre textos, por lo que es la hora de aprender más sobre el Big Data, una de las áreas laborales con mejores salarios y mayor demanda. Por eso, no te pierdas el Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp. Con esta formación intensiva adquirirás los conocimientos teóricos y prácticos imprescindibles para abrirte paso en el mundillo en pocos meses. ¡Da el paso para impulsar tu carrera y entra ahora para pedir más información!

Posts más leídos

¡CONVOCATORIA ABIERTA!

Big Data, IA & Machine Learning

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado