code: def levenshtein(source, target):
      """
      Compute Levenshtein-Distance between strings <source> and <target>.
      Taken from https://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#Python
      """
      if len(source) < len(target):
          return levenshtein(target, source)
  
      # So now we have len(source) >= len(target).
      if len(target) == 0:
          return len(source)
  
      # We call tuple() to force strings to be used as sequences
      # ('c', 'a', 't', 's') - numpy uses them as values by default.
      source = np.array(tuple(source))
      target = np.array(tuple(target))
  
      # We use a dynamic programming algorithm, but with the
      # added optimization that we only need the last two rows
      # of the matrix.
      previous_row = np.arange(target.size + 1)
      for s in source:
          # Insertion (target grows longer than source):
          current_row = previous_row + 1
  
          # Substitution or matching:
          # Target and source items are aligned, and either
          # are different (cost of 1), or are the same (cost of 0).
          current_row[1:] = np.minimum(
              current_row[1:], np.add(previous_row[:-1], target != s)
          )
  
          # Deletion (target grows shorter than source):
          current_row[1:] = np.minimum(
              current_row[1:], current_row[0:-1] + 1
          )
  
          previous_row = current_row
  
      return previous_row[-1]
  
imports: import xml.etree.ElementTree
  from collections import OrderedDict
  import json
  import struct
  import imghdr
  import numpy
  from .geom import pt, rect
label_desc: Use image node_id 10 for calling a global function with example usage: levenshtein(source, target) and returns: previous_row, levenshtein, len