我正在寻找一种算法,它可以编辑距离,但会忽略一个字符串和空白中的开始和结束:
edit("four","foor") = 1
edit("four","noise fo or blur") = 1
有没有现成的算法?甚至可能是Perl或Python库?
这里有一个Perl6解决方案。我使用的语法知道如何抓住四个有趣的字符,尽管中间有一些东西。更复杂的需求需要不同的语法,但这并不难。
每次有匹配时,NString::Actions类对象都会得到一个更改来检查匹配。它和我以前做的一样高水位。这看起来需要做更多的工作,这就是这个小例子。对于更复杂的例子,情况不会更糟。我的Perl5版本需要做大量的工具来确定保留什么或不保留什么。
use Text::Levenshtein;
my $string = 'The quixotic purple and jasmine butterfly flew over the quick zany dog';
grammar NString {
regex n-chars { [<.ignore-chars>* \w]**4 }
regex ignore-chars { \s }
}
class NString::Actions {
# See
my subset IntInf where Int:D | Inf;
has $.target;
has Str $.closest is rw = '';
has IntInf $.closest-distance is rw = Inf;
method n-chars ($/) {
my $string = $/.subst: /\s+/, '', :g;
my $distance = distance( $string, self.target );
# say "Matched <$/>. Distance for $string is $distance";
if $distance < self.closest-distance {
self.closest = $string;
self.closest-distance = $distance;
}
}
}
my $action = NString::Actions.new: target => 'Perl';
loop {
state $from = 0;
my $match = NString.subparse(
$string,
:rule('n-chars'),
:actions($action),
:c($from)
);
last unless ?$match;
$from++;
}
say "Shortest is { $action.closest } with { $action.closest-distance }";
(我从Perl 5做了一个直接的端口,我将在这里离开)
我在Perl 6中尝试了同样的方法,但我确信这有点冗长。我想知道是否有一种聪明的方法来抓取N个字符组进行比较。也许我以后会有一些进步。
use Text::Levenshtein;
put edit( "four", "foar" );
put edit( "four", "noise fo or blur" );
sub edit ( Str:D $start, Str:D $target --> Int:D ) {
my $target-modified = $target.subst: rx/\s+/, '', :g;
my $last-position-to-check = [-] map { .chars }, $target-modified, $start;
my $closest = Any;
my $closest-distance = $start.chars + 1;
for 0..$last-position-to-check -> $starting-pos {
my $substr = $target-modified.substr: $starting-pos, $start.chars;
my $this-distance = distance( $start, $substr );
put "So far: $substr -> $this-distance";
if $this-distance < $closest-distance {
$closest = $substr;
$closest-distance = $this-distance;
}
last if $this-distance = 0;
}
return $closest-distance // -1;
}
实现这一点的代码在概念上很简单。您可以自己添加您想要忽略的内容:
#!perl
use v5.22;
use feature qw(signatures);
no warnings qw(experimental::signatures);
use Text::Levenshtein qw(distance);
say edit( "four", "foor" );
say edit( "four", "noise fo or blur" );
sub edit ( $start, $target ) {
# transform strings to ignore what you want
# ...
distance( $start, $target )
}
可能要检查相同长度的所有子字符串:
use v5.22;
use feature qw(signatures);
no warnings qw(experimental::signatures);
use Text::Levenshtein qw(distance);
say edit( "four", "foar" );
say edit( "four", "noise fo or blur" );
sub edit ( $start, $target ) {
my $start_length = length $start;
$target =~ s/\s+//g;
my @all_n_chars = map {
substr $target, $_, 4
} 0 .. ( length($target) - $start_length );
my $closest;
my $closest_distance = $start_length + 1;
foreach ( @all_n_chars ) {
my $distance = distance( $start, $_ );
if( $distance < $closest_distance ) {
$closest = $_;
$closest_distance = $distance;
say "closest: $closest Distance: $distance";
last if $distance == 0;
}
}
return $closest_distance;
}
这个非常简单的实现可以找到您想要的。但是,请注意,其他随机字符串可能会意外地具有较低的编辑距离。
closest: foar Distance: 1
1
closest: nois Distance: 3
closest: foor Distance: 1
1
您可以扩展它来记住每个字符串的真实起始位置,这样您就可以在原始字符串中再次找到它,但这应该足以让您继续前进。如果你想使用Python,我认为这个程序看起来可能非常相似。
本文向大家介绍编辑距离相关面试题,主要包含被问及编辑距离时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 概念 编辑距离的作用主要是用来比较两个字符串的相似度的 编辑距离,又称Levenshtein距离(莱文斯坦距离也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数,如果它们的距离越大,说明它们越是不同。许可的编辑操作包括将一个字符替换成另一个字符,
本文向大家介绍什么是编辑距离?相关面试题,主要包含被问及什么是编辑距离?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 概念 编辑距离的作用主要是用来比较两个字符串的相似度的 编辑距离,又称Levenshtein距离(莱文斯坦距离也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数,如果它们的距离越大,说明它们越是不同。许可的编辑操作包括将一个字符替
这道题是 LeetCode 72 题。 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数。你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 动态规划 解决两个字符串的动态规划问题,一般都是用两个指针 i,j 分别指向两个字符串的最后,然后一步步往前走,缩小问题的规模。 定义状态:dp[i][j] 表示 s1、s2 长
问题内容: 在Python + Sqlite中是否有可用的字符串相似性度量,例如与模块有关? 用例示例: 此查询应匹配ID为1的行,但不匹配ID为2的行: 如何在Sqlite + Python中做到这一点? 关于我到目前为止发现的注释: 该Levenshtein距离,即单字符编辑(插入,删除或替换)的最小数量需要改变一个字到另一个,可能是有用的,但我不知道是否SQLite中存在的正式实施(我看到一
7. 直播开始/结束,/录制结束回调通知 7.1. 功能 通知客户直播已开始/结束,此接口为我方调用客户的接口,告知客户直播过程已开始(或结束) 7.2. 地址 由客户提供 7.3. 请求参数 直播结束参数: 必须有的参数: 流名,liveId(场次号),开始时间,结束时间 其它参数:推流端IP,推流URL 录制结束参数: 必须有的参数: 流名,liveId(场次号),开始时间,结束时间,状态(录
我有一个应用程序,上面有帖子、用户、标签等等。我一直在本地进行这项工作,但由于一个问题,无法将其推给heroku。最后,我成功地将我的应用程序推到了heroku,然后意识到我从未在那里迁移过我的数据库。所以我跑了 并得到这个错误: 我查了一下迁移,出于某种原因,它在其他任何事情之前都有删除表行: 我注释掉了drop table行,甚至删除了它,然后使用git commit提交,然后尝试运行hero