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.
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]))
Name | Metaphone representation |
Koa | K |
Casen | KSN |
Adelaide | ATLT |
Dominik | TMNK |
Tessa | TS |
Kimora | KMR |
Brody | BRT |
Juliana | JLN |
Julia | JL |
Jessie | JS |
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!