- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试在 JS 中创建一个 damerau-levenshtein 距离函数。
我在 WIkipedia 上找到了关于该算法的描述,但它们没有实现。它说:
To devise a proper algorithm to calculate unrestrictedDamerau–Levenshtein distance note that there always exists an optimalsequence of edit operations, where once-transposed letters are nevermodified afterwards. Thus, we need to consider only two symmetric waysof modifying a substring more than once: (1) transpose letters andinsert an arbitrary number of characters between them, or (2) delete asequence of characters and transpose letters that become adjacentafter deletion. The straightforward implementation of this idea givesan algorithm of cubic complexity: O\left (M \cdot N \cdot \max(M, N)\right ), where M and N are string lengths. Using the ideas ofLowrance and Wagner,[7] this naive algorithm can be improved to beO\left (M \cdot N \right) in the worst case. It is interesting thatthe bitap algorithm can be modified to process transposition. See theinformation retrieval section of[1] for an example of such anadaptation.
https://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance
第 [1] 节指向 http://acl.ldc.upenn.edu/P/P00/P00-1037.pdf这对我来说更复杂。
如果我没有理解错的话,要基于它创建一个实现并不是那么容易。
这是我目前使用的 levenshtein 实现:
levenshtein=function (s1, s2) {
// discuss at: http://phpjs.org/functions/levenshtein/
// original by: Carlos R. L. Rodrigues (http://www.jsfromhell.com)
// bugfixed by: Onno Marsman
// revised by: Andrea Giammarchi (http://webreflection.blogspot.com)
// reimplemented by: Brett Zamir (http://brett-zamir.me)
// reimplemented by: Alexander M Beedie
// example 1: levenshtein('Kevin van Zonneveld', 'Kevin van Sommeveld');
// returns 1: 3
if (s1 == s2) {
return 0;
}
var s1_len = s1.length;
var s2_len = s2.length;
if (s1_len === 0) {
return s2_len;
}
if (s2_len === 0) {
return s1_len;
}
// BEGIN STATIC
var split = false;
try {
split = !('0')[0];
} catch (e) {
// Earlier IE may not support access by string index
split = true;
}
// END STATIC
if (split) {
s1 = s1.split('');
s2 = s2.split('');
}
var v0 = new Array(s1_len + 1);
var v1 = new Array(s1_len + 1);
var s1_idx = 0,
s2_idx = 0,
cost = 0;
for (s1_idx = 0; s1_idx < s1_len + 1; s1_idx++) {
v0[s1_idx] = s1_idx;
}
var char_s1 = '',
char_s2 = '';
for (s2_idx = 1; s2_idx <= s2_len; s2_idx++) {
v1[0] = s2_idx;
char_s2 = s2[s2_idx - 1];
for (s1_idx = 0; s1_idx < s1_len; s1_idx++) {
char_s1 = s1[s1_idx];
cost = (char_s1 == char_s2) ? 0 : 1;
var m_min = v0[s1_idx + 1] + 1;
var b = v1[s1_idx] + 1;
var c = v0[s1_idx] + cost;
if (b < m_min) {
m_min = b;
}
if (c < m_min) {
m_min = c;
}
v1[s1_idx + 1] = m_min;
}
var v_tmp = v0;
v0 = v1;
v1 = v_tmp;
}
return v0[s1_len];
}
对于构建这样的算法,您有什么想法?如果您认为它太复杂,我可以做些什么来区分“l”(L 小写)和“I”(i 大写)。
最佳答案
要点@doukremt 给出:https://gist.github.com/doukremt/9473228
在 Javascript 中给出以下内容。
您可以在权重对象中更改操作的权重。
var levenshteinWeighted= function(seq1,seq2)
{
var len1=seq1.length;
var len2=seq2.length;
var i, j;
var dist;
var ic, dc, rc;
var last, old, column;
var weighter={
insert:function(c) { return 1.; },
delete:function(c) { return 0.5; },
replace:function(c, d) { return 0.3; }
};
/* don't swap the sequences, or this is gonna be painful */
if (len1 == 0 || len2 == 0) {
dist = 0;
while (len1)
dist += weighter.delete(seq1[--len1]);
while (len2)
dist += weighter.insert(seq2[--len2]);
return dist;
}
column = []; // malloc((len2 + 1) * sizeof(double));
//if (!column) return -1;
column[0] = 0;
for (j = 1; j <= len2; ++j)
column[j] = column[j - 1] + weighter.insert(seq2[j - 1]);
for (i = 1; i <= len1; ++i) {
last = column[0]; /* m[i-1][0] */
column[0] += weighter.delete(seq1[i - 1]); /* m[i][0] */
for (j = 1; j <= len2; ++j) {
old = column[j];
if (seq1[i - 1] == seq2[j - 1]) {
column[j] = last; /* m[i-1][j-1] */
} else {
ic = column[j - 1] + weighter.insert(seq2[j - 1]); /* m[i][j-1] */
dc = column[j] + weighter.delete(seq1[i - 1]); /* m[i-1][j] */
rc = last + weighter.replace(seq1[i - 1], seq2[j - 1]); /* m[i-1][j-1] */
column[j] = ic < dc ? ic : (dc < rc ? dc : rc);
}
last = old;
}
}
dist = column[len2];
return dist;
}
关于javascript - Damerau-Levenshtein 距离实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22308014/
我正在寻找 Damerau–Levenshtein 的实现PHP 的算法,但我的 friend google 似乎找不到任何东西。到目前为止,我必须使用 PHP 实现的 Levenshtein(没有
我坐在这里用 Java 为我的主程序编写一些算法(这是迄今为止的第一个)。我对 levenshtein 算法进行了很好的编程,这要归功于 wiki 对新手的伪代码非常好,还有一个很好的教程 :D 然后
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 问题必须表现出对正在解决的问题的最低限度的理解。告诉我们您尝试过的方法、为什么不起作用以及它应该 起作用
similar_text()中文汉字版 复制代码 代码如下: <?php &nbs
我实现了一个 levenshtein trie 来查找与给定单词相似的单词。 我的目标是有一种快速的方法来进行拼写纠正。 但是我发现有一种更快的方法可以做到这一点: 莱文斯坦自动机 我只是有一个问题.
说我的数据库中有以下两个字符串: (1) 'Levi Watkins Learning Center - Alabama State University' (2) 'ETH Library' 我的软
这是一个字符串 T : 'men shirt team brienne funny sarcasm shirt features graphic tees mugs babywear much rea
我想使用字符串相似度函数来查找数据库中损坏的数据。 我遇到了其中几个: 贾罗, 贾罗-温克勒, 编辑, 欧几里得和 Q-gram, 我想知道它们之间有什么区别以及它们在什么情况下效果最好? 最佳答案
我需要一些有关以下代码的帮助。在这种情况下,我需要找到与输入的单词最接近的单词来测试我将 word_0 设置为“pikaru”,它应该返回“pikachu”。 levenshtein 函数返回我们输入
我有一个脚本可以使用 Levenshtein 在数据库中搜索单词。当我搜索英文单词时一切正常,但是当我搜索俄语单词时,MySQL 控制台报错: [22007][1366] (conn=31079) I
列支敦士登在c编程中总是返回无限循环这是我的代码我尝试了很多解决方案并且我尝试存储变量并使用指针但总是有无限循环我认为这是因为3个递归调用但在列支敦士登算法的文档中我找到了这个实现 #include
有什么方法可以对数组使用 Levenshtein Distance例如我有一个包含多个文本的 div one,two,three,longtext,anything 和一个输入 // sometex
这是我为了好玩而编写的 Levenshtein 距离的并行实现。我对结果很失望。我在核心 i7 处理器上运行它,所以我有很多可用线程。但是,当我增加线程数时,性能会显着下降。我的意思是,对于相同大小的
我想对 mysql 查询结果执行编辑。 查询如下所示: $query_GID = "select `ID`,`game` from `gkn_catalog`"; $result_GID = $dbc
我有包含两个相似字符的字符串。两者都显示为带有 ogonek 的小“a”: ± ± (注意:根据渲染器,它们有时呈现相似,有时略有不同) 但是,它们是不同的: 第一个字符的特征: 在 PostgreS
我有一个足够有效的查询,但我想通过在查询参数和相关字段之间使用 levenshtein 对结果进行排序。 现在我在 ES 中进行查询,然后在我的应用程序中进行排序。现在我正在测试脚本字段。这是脚本 i
我使用此查询来搜索公司详细信息 select * from company_details where levenshtein_ratio('New York Life Insurance Compa
我正在寻找一个字符串比较指标 ala Levenshtein,当字符串中的字符被打乱时,它也可以工作。有谁知道这样的指标?如果有一个 Python 模块可以计算这样的指标,那就太好了。谢谢! 最佳答案
R 中有一个名为stringdist 的package,它包含计算Levenshtein 字符串距离的函数。这个包有两个问题: 1st 它不适用于大字符串,例如: set.seed(1) a.str
我正在编写一个使用比较来确定模糊匹配的脚本,因此我正在使用 Levenshtein 功能。 不幸的是,当我在终端窗口中运行 easy_install python-Levenshtein 时,当我在其
我是一名优秀的程序员,十分优秀!