Advertisement
RemcoE33

Levenshtein Distance

Mar 2nd, 2023
717
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2. * Calculates the Levenshtein Distance.
  3. *
  4. * @param {A1:A5} source_range  Input range one.
  5. * @param {A1:A5} target_range  Input range two.
  6. * @return {number} decimal representation of the % differenc
  7. * @customfunction
  8. */
  9. function LEVDIST(source_range, target_range) {
  10.   if (!Array.isArray(source_range)) {
  11.     source_range = [source_range]
  12.   }
  13.  
  14.   if (!Array.isArray(target_range)) {
  15.     target_range = [target_range]
  16.   }
  17.  
  18.   source_range = source_range.flat()
  19.   target_range = target_range.flat()
  20.  
  21.   if (source_range.length !== target_range.length) {
  22.     throw new Error("Ranges are of different length")
  23.   }
  24.  
  25.   const results = [];
  26.  
  27.   source_range.forEach((source, k) => {
  28.     const target =  target_range[k]
  29.     if (source == target) results.push(1)
  30.     if (source.length == 0) results.push(0)
  31.     if (target.length == 0) results.push(0)
  32.  
  33.     var v0 = [];
  34.     var v1 = [];
  35.     var i;
  36.     var j;
  37.     var cost;
  38.  
  39.     for (i = 0; i < (target.length + 1); i++) {
  40.       v0[i] = i;
  41.     }
  42.  
  43.     for (i = 0; i < source.length; i++) {
  44.       v1[0] = i + 1;
  45.       for (j = 0; j < target.length; j++) {
  46.         if (source[i] == target[j]) {
  47.           cost = 0;
  48.         } else {
  49.           cost = 1;
  50.         }
  51.         v1[j + 1] = Math.min(v1[j] + 1, v0[j + 1] + 1, v0[j] + cost);
  52.       }
  53.       for (j = 0; j < (target.length + 1); j++) {
  54.         v0[j] = v1[j];
  55.       }
  56.     }
  57.     results.push([(source.length - v1[target.length]) / source.length])
  58.   })
  59.  
  60.   return results
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement