https://github.com/jabez007/davaweave_functions_library
Library of Dataweave functions I've found useful
https://github.com/jabez007/davaweave_functions_library
Last synced: 7 months ago
JSON representation
Library of Dataweave functions I've found useful
- Host: GitHub
- URL: https://github.com/jabez007/davaweave_functions_library
- Owner: jabez007
- License: mit
- Created: 2021-11-05T18:57:30.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2021-11-05T19:35:42.000Z (almost 4 years ago)
- Last Synced: 2025-01-07T03:12:21.492Z (9 months ago)
- Size: 7.81 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Davaweave Functions Library
Library of Dataweave functions I've found useful## damerauLevenshteinDistance
https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distancehttps://reference.wolfram.com/language/ref/DamerauLevenshteinDistance.html
https://www.guyrutenberg.com/2008/12/15/damerau-levenshtein-distance-in-python/
### Examples
`damerauLevenshteinDistance("mccann", "mccann")` => `0``damerauLevenshteinDistance("mccann", "mccan")` => `1`
`damerauLevenshteinDistance("mccann", "mcan")` => `2`
`damerauLevenshteinDistance("mccann", "mcacnn")` => `1`
### Implementation
the [range](ported_from_python#range) and [enumerate](ported_from_python#enumerate) functions can be found in [ported_from_python](ported_from_python)
```
fun damerauLevenshteinMatrix(s1: String, s2: String) = do {
var di = range(-1, sizeOf(s1) + 1) reduce (i, acc = {}) -> acc ++ {
"$(i), -1": i + 1
}
var dj = range(-1, sizeOf(s2) + 1) reduce (j, acc = {}) -> acc ++ {
"-1, $(j)": j + 1
}
---
enumerate(s1) reduce (enu1, acc1 = di ++ dj) -> acc1 ++ do {
var i = enu1[0]
var cs1 = enu1[1]
---
enumerate(s2) reduce (enu2, acc2 = {}) -> acc2 ++ do {
var j = enu2[0]
var cs2 = enu2[1]
var cost = if (cs1 == cs2) 0 else 1
var tmp = acc1 ++ acc2
var dijMin = min([
(tmp["$(i - 1), $(j)"] as Number) + 1, // deletion
(tmp["$(i), $(j - 1)"] as Number) + 1, // insertion
(tmp["$(i - 1), $(j - 1)"] as Number) + cost // substitution
])
---
if (i > 0 and j > 0 and cs1 == s2[j - 1] and s1[i - 1] == cs2) {
"$(i), $(j)": min([
dijMin,
(tmp["$(i - 2), $(j - 2)"] as Number) + cost // transposition
])
} else {
"$(i), $(j)": dijMin
}
}
}
}fun damerauLevenshteinDistance(s1: String, s2: String): Number =
damerauLevenshteinMatrix(s1, s2)["$(sizeOf(s1) - 1), $(sizeOf(s2) - 1)"] as Numberfun damerauLevenshteinDistanceNormalized(s1: String, s2: String): Number = do {
var maxDist = max([sizeOf(s1), sizeOf(s2)]) default 0
---
if (maxDist > 0)
1 - (damerauLevenshteinDistance(s1, s2) / maxDist)
else
0
}
```