- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现真正高效的 Clojure 函数来计算 Damerau-Levenshtein distance 。我决定使用this algorithm (所附源代码应为 C++)用于计算 Levenshtein 距离并添加一些行以使其适用于 DLD。
这是我在 Common Lisp 中创建的内容(我希望它能有所帮助):
(defun damerau-levenshtein (x y)
(declare (type string x y)
#.*std-opts*)
(let* ((x-len (length x))
(y-len (length y))
(v0 (apply #'vector (mapa-b #'identity 0 y-len)))
(v1 (make-array (1+ y-len) :element-type 'integer))
(v* (make-array (1+ y-len) :element-type 'integer)))
(do ((i 0 (1+ i)))
((= i x-len) (aref v0 y-len))
(setf (aref v1 0) (1+ i))
(do ((j 0 (1+ j)))
((= j y-len))
(let* ((x-i (char x i))
(y-j (char y j))
(cost (if (char-equal x-i y-j) 0 1)))
(setf (aref v1 (1+ j)) (min (1+ (aref v1 j))
(1+ (aref v0 (1+ j)))
(+ (aref v0 j) cost)))
(when (and (plusp i) (plusp j))
(let ((x-i-1 (char x (1- i)))
(y-j-1 (char y (1- j)))
(val (+ (aref v* (1- j)) cost)))
(when (and (char-equal x-i y-j-1)
(char-equal x-i-1 y-j)
(< val (aref v1 (1+ j))))
(setf (aref v1 (1+ j)) val))))))
(rotatef v* v0 v1))))
现在,我担心我无法将其转换为真正高效且惯用的 Clojure 代码(函数式风格?)。我真的很感激任何建议,我认为它对许多 future 的读者也可能非常有用。
附注我找到了this implementation ,但我怀疑它是否有效,并且它使用了一些过时的contrib函数(deep-merge-with和bool-to-binary):
(defn damerau-levenshtein-distance
[a b]
(let [m (count a)
n (count b)
init (apply deep-merge-with (fn [a b] b)
(concat
;;deletion
(for [i (range 0 (+ 1 m))]
{i {0 i}})
;;insertion
(for [j (range 0 (+ 1 n))]
{0 {j j}})))
table (reduce
(fn [d [i j]]
(deep-merge-with
(fn [a b] b)
d
(let [cost (bool-to-binary (not (= (nth a (- i 1))
(nth b (- j 1)))))
x
(min
(+ ((d (- i 1))
j) 1) ;;deletion
(+ ((d i)
(- j 1)) 1) ;;insertion
(+ ((d (- i 1))
(- j 1)) cost)) ;;substitution))
val (if (and (> i 1)
(> j 1)
(= (nth a (- i 1))
(nth b (- j 2)))
(= (nth a (- i 2))
(nth b (- j 1))))
(min x (+ ((d (- i 2))
(- j 2)) ;;transposition
cost))
x)]
{i {j val}})))
init
(for [j (range 1 (+ 1 n))
i (range 1 (+ 1 m))] [i j]))]
((table m) n)))
最佳答案
我最近不得不在 clojure 中编写一个高效的 levenshtein 距离函数来计算真实文本和 ocr 引擎结果之间的编辑。递归实现的性能不足以快速计算两个整页之间的编辑距离,因此我的实现使用动态编程。它没有使用 java 2d 数组,而是使用 core.matrix 来处理矩阵内容。为damerau-levenshtein 添加转置内容应该不难。
(defn lev [str1 str2]
(let [mat (new-matrix :ndarray (inc (count str1)) (inc (count str2)))
len1 (count str1) len2 (count str2)]
(mset! mat 0 0 0)
(dotimes [i lein1]
(mset! mat (inc i) 0 (inc i)))
(dotimes [j len2]
(mset! mat 0 (inc j) (inc j)))
(dotimes [dj len2]
(dotimes [di len1]
(let [j (inc dj) i (inc di)]
(mset! mat i j
(cond
(= (.charAt ^String str1 di) (.charAt ^String str2 dj))
(mget mat di dj)
:else
(min (inc (mget mat di j)) (inc (mget mat i dj))
(inc (mget mat di dj))))))))
(mget mat len1 len2))))
希望这有帮助
关于performance - Damerau-Levenshtein 距离的高效实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25767064/
我正在尝试实现真正高效的 Clojure 函数来计算 Damerau-Levenshtein distance 。我决定使用this algorithm (所附源代码应为 C++)用于计算 Leven
Levenshtein 距离可以使用两行以这种方式迭代计算: https://en.wikipedia.org/wiki/Levenshtein_distance#Iterative_with_two
我正在尝试在 JS 中创建一个 damerau-levenshtein 距离函数。 我在 WIkipedia 上找到了关于该算法的描述,但它们没有实现。它说: To devise a proper a
对于讲荷兰语的人来说,两个字符“ij”被认为是一个很容易与“y”交换的字母。 对于我正在从事的项目,我想要一个 Damerau–Levenshtein distance 的变体将“ij”和“y”之间的
我正在寻找 Damerau–Levenshtein 的实现PHP 的算法,但我的 friend google 似乎找不到任何东西。到目前为止,我必须使用 PHP 实现的 Levenshtein(没有
Damerau-Levenshtein 距离如下: "abcd", "aacd" => 1 DL distance "abcd", "aadc" => 2 DL distance 关于编辑距离的更多信
Damerau-Levenshtein 距离如下: "abcd", "aacd" => 1 DL distance "abcd", "aadc" => 2 DL distance 关于编辑距离的更多信
我正在为 Microsoft Office 套件构建一个私有(private)拼写检查器。我正在对拼写错误及其潜在修复进行字符串比较,以确定我想要包含哪些更正。 我对用于字符串比较的加权 Damera
我带着另一个较长的问题回来了。尝试了一些基于 Python 的 Damerau-Levenshtein编辑距离实现,I finally found the one listed below作为 edi
我有以下 cython 实现计算 2 个字符串的 Damerau–Levenshtein 距离,基于 this Wikipedia article ,但目前它对我的需求来说太慢了。我有一个大约 600
我坐在这里用 Java 为我的主程序编写一些算法(这是迄今为止的第一个)。我对 levenshtein 算法进行了很好的编程,这要归功于 wiki 对新手的伪代码非常好,还有一个很好的教程 :D 然后
如何在 Damerau-Levenshtein 距离算法的实现中禁用删除计数,或者如果已经实现了其他算法,请指出。 示例(禁用删除计数): string1:你好吗? string2:怎么样? 距离:
我有以下实现,但我想添加一个阈值,所以如果结果要大于它,就停止计算并返回。 我该怎么做? 编辑:这是我当前的代码,threshold 尚未使用...目标是使用它 public static i
我正在尝试使用 Jellyfish使用模糊字符串。我注意到 Damerau–Levenshtein distance 的一些奇怪行为算法。例如: import jellyfish as jf In [
我正在寻找这样一种算法,但它是一种在单词之间而不是在字母之间进行替换的算法。有这样的算法吗? 我正在寻找 SQL Server 的实现,但算法的名称就足够了。 最佳答案 据我所知,没有理由不能只使用现
这是我的代码: #http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance # used for fuzzy matching
有谁知道 Damerau–Levenshtein 距离算法的 MySQL 实现是一个存储过程/函数,它将单个指定字符串作为参数并在特定表的特定字段中查找字符串的模糊匹配? 我找到了各种比较两个指定字符
我想知道如何修改 Damerau-Levenshtein 算法以跟踪将源字符串更改为目标字符串所需的特定字符转换。 Levenshtein distance 已回答此问题,但我找不到 DL 距离的任何
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 问题必须表现出对正在解决的问题的最低限度的理解。告诉我们您尝试过的方法、为什么不起作用以及它应该 起作用
最近在MySQL中实现了Damerau-Levenshtein算法的UDF,想知道有没有办法把Damerau-Levenshtein算法的模糊匹配和Like函数的通配符搜索结合起来?如果我在表中有以下
我是一名优秀的程序员,十分优秀!