比较字符串并比较它们的匹配程度

时间:2012-11-03 16:05:27

标签: php match levenshtein-distance

我从日志中提取异常,这是一个例子:

异常:System.InvalidOperationException:修改了集合;枚举操作可能无法执行。 在System.Collections.Generic.List`1.Enumerator.MoveNextRare() at test.Modules.UI.Table。<> c_ DisplayClass2.b _0() 在System.Win

有时日志使用不同的语言,所以它看起来像这样:

异常:System.InvalidOperationException:Laoconlecciónfuemodificada,laoperacióndeenumeraciónnopuede ejecutar。 在System.Collections.Generic.List`1.Enumerator.MoveNextRare() 在Test.Modules.UI.Table。<> c_ DisplayClass2.b _0() 在System.Win

正如您所看到的,只有异常部分在不同的语言中有所不同,但后面的部分将是相同的。我将所有这些例外存储在数据库中,所有这些例外都被修剪为300个字符,因为通常会有更长的时间,但300个字符足以判断是否存在相同的

所以我想也许可以跳过异常并比较接下来的300个字符但是很难知道异常在哪里结束,没有任何具体的东西显示异常的开始和结束。

我有什么想法可以克服这个问题?也许我只是使用Levenshtein突出显示匹配的位置,然后我可以过滤那些并且可能设置一个界面,允许我链接异常一旦我手动识别出同样的异常只是用不同的语言写的?

我的最终目标是检查数以千计的这些日志并查看有多少异常被发现,大多数日志都是英文,但也许25%是非英语的,所以通常我只能运行一个查询的确切匹配异常,因为异常部分的语言不同,它可能只有60-70%的匹配。可能在极少数情况下异常后的部分与不同的异常相匹配,但这种情况很少见,所以并不是太过关注

我需要在PHP中执行此操作

1 个答案:

答案 0 :(得分:0)

不是100%健壮,但您可以根据第二个分号前面的文本和单词at后面的文本进行匹配。我打赌单词at之后是一个新行,因此单词+ new line不太可能出现在异常消息本身中(使其成为分隔符的合适选择)。

我认为您设计的任何方案,您都希望完全忽略异常消息。你不会在语言之间找到共同的结构,所以允许短信成为匹配排名的一部分只会削弱你的匹配的信心。