levenshtein.py 869 B

12345678910111213141516171819202122232425262728293031323334
  1. from .string_distance import MetricStringDistance
  2. class Levenshtein(MetricStringDistance):
  3. def distance(self, s0, s1):
  4. if s0 is None:
  5. raise TypeError("Argument s0 is NoneType.")
  6. if s1 is None:
  7. raise TypeError("Argument s1 is NoneType.")
  8. if s0 == s1:
  9. return 0.0
  10. if len(s0) == 0:
  11. return len(s1)
  12. if len(s1) == 0:
  13. return len(s1)
  14. v0 = [0] * (len(s1) + 1)
  15. v1 = [0] * (len(s1) + 1)
  16. for i in range(len(v0)):
  17. v0[i] = i
  18. for i in range(len(s0)):
  19. v1[0] = i + 1
  20. for j in range(len(s1)):
  21. cost = 1
  22. if s0[i] == s1[j]:
  23. cost = 0
  24. v1[j + 1] = min(v1[j] + 1, v0[j + 1] + 1, v0[j] + cost)
  25. v0, v1 = v1, v0
  26. return v0[len(s1)]