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

时间:2015-06-12 19:09:41

标签: string algorithm python-2.7 math

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

我抬头看了Levenshtein的距离,但到目前为止我认为它没有达到我的目标,因为它比较了相同长度的弦。我的两个字符串很可能是明显不同的长度(堆栈跟踪)。我正在寻找内容或单词比较,而不是char到char比较。百分比答案是其中最重要的部分。

我假设某人有算法​​或愿意指出我正确的方向? 谢谢 阅读,甚至更多的帮助!

间接的例子......将它们视为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

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

但是当你有相同的文件路径,但不同的错误。迹线长达数百行,因此显示完整的示例并非合理。这个例子尽可能接近我没有实际的痕迹。

1 个答案:

答案 0 :(得分:1)

实现这一目标的一种方法是通过Jaro-Winkler String Similarity metric的应用程序。令人高兴的是,这有一个PyPI package

让我们从三个字符串开始,你的两个例子,以及问题的开头:

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

但是,既然您知道问题域的某些内容(它是一系列堆栈跟踪),您可以通过计算行差异来做得更好,可能:

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]

所以,你需要尝试这个,但你可以试试,给定两个堆栈跟踪,计算一个"距离"这是一个矩阵 - i-j条目是第一个到第二个第j个第i个字符串之间的相似性。 (这在计算上有点贵。)看看是否存在获得非常高分数的百分比或条目数的阈值。