String 两个不同长度字符串的b/t差异百分比

String 两个不同长度字符串的b/t差异百分比,string,algorithm,python-2.7,math,String,Algorithm,Python 2.7,Math,我遇到了一个问题,我试图阻止字符串的重复。到目前为止,最好的解决方案是比较字符串的百分比,并检查它是否高于某个固定点 我已经查找了Levenshtein距离,但到目前为止我认为它并没有达到我的目标,因为它比较了相同长度的字符串。我的两个字符串的长度很可能会有显著差异(堆栈跟踪)。我在寻找内容或单词的比较,而不是字符对字符的比较。百分比答案是其中最重要的部分 我想有人有一个算法或者愿意为我指出正确的方向?谢谢你的阅读,更感谢你的帮助 一个间接的例子。。。将它们视为py.test表单中的堆栈跟踪。

我遇到了一个问题,我试图阻止字符串的重复。到目前为止,最好的解决方案是比较字符串的百分比,并检查它是否高于某个固定点

我已经查找了Levenshtein距离,但到目前为止我认为它并没有达到我的目标,因为它比较了相同长度的字符串。我的两个字符串的长度很可能会有显著差异(堆栈跟踪)。我在寻找内容或单词的比较,而不是字符对字符的比较。百分比答案是其中最重要的部分

我想有人有一个算法或者愿意为我指出正确的方向?谢谢你的阅读,更感谢你的帮助

一个间接的例子。。。将它们视为py.test表单中的堆栈跟踪。 我有文件路径,正在比较它们

/test/opt/somedir/blah/something  
def do_something(self, x):
    return x
SomeError: do_something in 'filepath' threw some exception or something
vs


但是,当您有相同的文件路径,但有不同的错误时。这些痕迹有数百行长,因此显示完整的示例是不合理的。这个例子是我在没有实际跟踪的情况下所能得到的最接近的结果。

解决这个问题的一种方法是通过应用。幸运的是,这有一个很好的例子

让我们从三个字符串、两个示例和问题的开头开始:

s1 = u'''
/test/opt/somedir/blah/something  
def do_something(self, x):
    return x
SomeError: do_something in 'filepath' threw some exception or something'''

s2 = u'''
/test/opt/somedir/blah2/somethingelse
def do_another_thing(self, y):
    return y
SomeError: do_another_thing in 'different filepath' threw some exception'''

q = u'''
I have a problem where I am trying to prevent repeats of a string. So far the best solution is to compare the strings for a percentage and check if it is above a certain fixed point.'''
那么相似之处是:

>> jaro.jaro_metric(s1, s2)
0.8059572665529058

>> jaro.jaro_metric(s1, q)
0.6562121541167517

但是,由于您对问题域有所了解(这是一系列StackTrace行),您可以通过计算行差异来做得更好,也许:

import itertools

>> [jaro.jaro_metric(l1, l2) for l1, l2 in itertools.izip(s1.split('\n'), s2.split('\n'))]
[1.0,
 0.9353471118177001,
 0.8402824228911184,
 0.9444444444444443,
 0.8043725314852076]

因此,您需要对此进行实验,但您可以尝试,给定两个StackTrace,计算“距离”,这是一个矩阵-i-j条目将是第一个字符串的第i个字符串与第二个字符串的第j个字符串之间的相似性。(这在计算上有点昂贵。)看看是否有一个门槛来限制获得高分的条目的百分比或数量。

什么语言?许多语言都允许您简单地循环并逐字比较。如果你有一个特定的单词,你可以在每个字符串上使用正则表达式。我正在寻找更多的算法。不过Python会更好。我考虑过这个问题,但我不确定它如何处理不同长度的字符串,特别是当它是一个带有文件路径和代码的堆栈跟踪时(对于多个大型测试,是py.test输出)。Levenshtein不限于相同长度的字符串。@Ian你不傻,但它包括插入和擦除操作,所以它不限于相等的长度。顺便说一句,我必须说我根本不理解你的问题。你可以考虑添加一个简短的例子。最长的公共子串(或子序列)可能会给你一些信息。谢谢@ AMI。非常有用。我可能会使用带有字符串的应用程序(因为我的示例是错误的,我可能会有一两行额外的代码)。但这几乎完美地满足了我的需求。我试过之后会给你回复,不过谢谢你!
import itertools

>> [jaro.jaro_metric(l1, l2) for l1, l2 in itertools.izip(s1.split('\n'), s2.split('\n'))]
[1.0,
 0.9353471118177001,
 0.8402824228911184,
 0.9444444444444443,
 0.8043725314852076]