我有一个问题,我试图阻止重复的字符串。到目前为止,最好的解决方案是比较字符串的百分比,并检查它是否高于某个固定点。
我抬头看了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
但是当你有相同的文件路径,但不同的错误。迹线长达数百行,因此显示完整的示例并非合理。这个例子尽可能接近我没有实际的痕迹。
答案 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个字符串之间的相似性。 (这在计算上有点贵。)看看是否存在获得非常高分数的百分比或条目数的阈值。