ai-pronunciation-trainer / WordMetrics.py
thiagohgl's picture
First repository code commit
28d0c5f
raw
history blame
2.05 kB
import numpy as np
# ref from https://gitlab.com/-/snippets/1948157
# For some variants, look here https://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#Python
# Pure python
def edit_distance_python2(a, b):
# This version is commutative, so as an optimization we force |a|>=|b|
if len(a) < len(b):
return edit_distance_python(b, a)
if len(b) == 0: # Can deal with empty sequences faster
return len(a)
# Only two rows are really needed: the one currently filled in, and the previous
distances = []
distances.append([i for i in range(len(b)+1)])
distances.append([0 for _ in range(len(b)+1)])
# We can prefill the first row:
costs = [0 for _ in range(3)]
for i, a_token in enumerate(a, start=1):
distances[1][0] += 1 # Deals with the first column.
for j, b_token in enumerate(b, start=1):
costs[0] = distances[1][j-1] + 1
costs[1] = distances[0][j] + 1
costs[2] = distances[0][j-1] + (0 if a_token == b_token else 1)
distances[1][j] = min(costs)
# Move to the next row:
distances[0][:] = distances[1][:]
return distances[1][len(b)]
#https://stackabuse.com/levenshtein-distance-and-text-similarity-in-python/
def edit_distance_python(seq1, seq2):
size_x = len(seq1) + 1
size_y = len(seq2) + 1
matrix = np.zeros ((size_x, size_y))
for x in range(size_x):
matrix [x, 0] = x
for y in range(size_y):
matrix [0, y] = y
for x in range(1, size_x):
for y in range(1, size_y):
if seq1[x-1] == seq2[y-1]:
matrix [x,y] = min(
matrix[x-1, y] + 1,
matrix[x-1, y-1],
matrix[x, y-1] + 1
)
else:
matrix [x,y] = min(
matrix[x-1,y] + 1,
matrix[x-1,y-1] + 1,
matrix[x,y-1] + 1
)
#print (matrix)
return (matrix[size_x - 1, size_y - 1])