Module leven
Expand source code
#!/usr/bin/env python
# Levenstein distance. Converted from CPP
#import re, string, gtk, glib, gobject
from __future__ import print_function
#from six.moves import range
darr = [];
MXDIM = 36
#//****************************
#// Get minimum of three values
#//****************************
def Minimum(a, b, c):
mi = a;
if b < mi:
mi = b
if c < mi:
mi = c
return mi
#//****************************
#// Show Matrix
#//****************************
def show_mx(darr):
cnt = 0
for ii in darr:
cnt2 = 0
for iii in ii:
print(darr[cnt][cnt2], end=' ')
cnt2 += 1
print()
cnt += 1
print()
#//****************************
#// Create Matrix
#//****************************
def create_mx():
global darr
# Create two dimentional list
for ii in range(MXDIM):
darr2 = []
for iii in range(MXDIM):
darr2.append(0)
darr.append(darr2[:])
#//*****************************
#// Compute Levenshtein distance
#//*****************************
def Distance (s, t):
global darr
n = len(s); m = len(t);
if n > MXDIM or m > MXDIM:
print("Levenshtine -- Warn: Array Dim exceeded ", s, t)
return MXDIM
#print "'" + s+ "'", "'" + t + "'"
#print "n", n, "m", m
#// If any of them is empty ... return len() of the other
if (n == 0): return m;
if (m == 0): return n;
cost = 0
#// Step 1 Create matrix
if len(darr) == 0:
create_mx()
#// Step 2 Fill matrix
for ii in range(n+1):
darr[ii][0] = ii
for ii in range(m+1):
darr[0][ii] = ii
#// Step 3 Eval matrix
for ii in range(1, n+1):
s_i = s[ii-1]
for iii in range(1, m+1):
t_j = t[iii - 1]
if (s_i == t_j):
cost = 0
else:
cost = 1
above = darr[ii-1][iii] # GetAt (d,i-1,j, n);
left = darr[ii][iii-1] # GetAt (d,i, j-1, n);
diag = darr[ii-1][iii-1] # GetAt (d, i-1,j-1, n);
cell = Minimum(above + 1, left + 1, diag + cost)
darr[ii][iii] = cell # PutAt (d, i, j, n, cell);
result = darr[n][m]
return result;
Functions
def Distance(s, t)
-
Expand source code
def Distance (s, t): global darr n = len(s); m = len(t); if n > MXDIM or m > MXDIM: print("Levenshtine -- Warn: Array Dim exceeded ", s, t) return MXDIM #print "'" + s+ "'", "'" + t + "'" #print "n", n, "m", m #// If any of them is empty ... return len() of the other if (n == 0): return m; if (m == 0): return n; cost = 0 #// Step 1 Create matrix if len(darr) == 0: create_mx() #// Step 2 Fill matrix for ii in range(n+1): darr[ii][0] = ii for ii in range(m+1): darr[0][ii] = ii #// Step 3 Eval matrix for ii in range(1, n+1): s_i = s[ii-1] for iii in range(1, m+1): t_j = t[iii - 1] if (s_i == t_j): cost = 0 else: cost = 1 above = darr[ii-1][iii] # GetAt (d,i-1,j, n); left = darr[ii][iii-1] # GetAt (d,i, j-1, n); diag = darr[ii-1][iii-1] # GetAt (d, i-1,j-1, n); cell = Minimum(above + 1, left + 1, diag + cost) darr[ii][iii] = cell # PutAt (d, i, j, n, cell); result = darr[n][m] return result;
def Minimum(a, b, c)
-
Expand source code
def Minimum(a, b, c): mi = a; if b < mi: mi = b if c < mi: mi = c return mi
def create_mx()
-
Expand source code
def create_mx(): global darr # Create two dimentional list for ii in range(MXDIM): darr2 = [] for iii in range(MXDIM): darr2.append(0) darr.append(darr2[:])
def show_mx(darr)
-
Expand source code
def show_mx(darr): cnt = 0 for ii in darr: cnt2 = 0 for iii in ii: print(darr[cnt][cnt2], end=' ') cnt2 += 1 print() cnt += 1 print()