MinHash 值在 MinHashLSH 索引中的关系 [Python3 / datasketch lib]

问题描述

我正在做一个项目,该项目应该比较在日志中发现的错误并决定它们是否彼此相关(例如,如果没有给定相似性的错误堆栈,则将错误堆栈作为“父”写入数据库水平之前发现)。 目前,我对整个错误堆栈跟踪使用单个 MinHash,可能是 3 或 10 行或任何行数。

  1. 发现新的日志文件时有一个重复数据删除步骤: -找到堆栈跟踪 -> MinHash 提取 -> MinHashLSH.query -> MinHashLSH.insert,以防其相似度不高于阈值。否则,我们认为它足够相似并从处理中跳过它。

  2. 然后在数据库中查找现有的父/子对象,并在需要时保存新对象。 LSH索引保存在Redis中。

项目的当前实施效果很好;但是,它没有涵盖一些短堆栈跟踪是长堆栈跟踪的几行第一行的 100% 副本的情况。可以想象,这 2 个堆栈跟踪的 Jaccard 相似度远低于所需的 0.8 阈值水平。

长堆栈跟踪示例:

无法连接到服务(ConnectionFailedException)

ModuleName1.ClassName1.MethodName(ErrorText1)

ModuleName2.ClassName2.MethodName(ErrorText2)

ModuleName3.ClassName3.MethodName(ErrorText3)

ModuleName4.ClassName4.MethodName(ErrorText4)

ModuleName5.ClassName5.MethodName(ErrorText5)

短堆栈跟踪示例:

无法连接到服务(ConnectionFailedException)

ModuleName1.ClassName1.MethodName(ErrorText1)

ModuleName2.ClassName2.MethodName(ErrorText2)

我想到的第一件事是为每个堆栈跟踪行提取MinHash并单独存储。然后我可能会检查短堆栈跟踪的 n 行是否与长堆栈跟踪的前 n 行具有 1.0 相似度。从那里我们可以决定短堆栈跟踪是否是长堆栈跟踪的 100% 副本并将其保存为子项。 但是,我无法解决我应该如何在 MinHashLSH 中存储几个相关索引以及在这种情况下我应该如何找到现有 n 哈希和新堆栈跟踪的 m 哈希之间的所有关系。我也许可以分配一些相关的索引名称,但是 MinHashLSH 只需要对象的 MinHash 来查找键,反之亦然。

我的问题是:

  • 这甚至可能实现我正在考虑的事情吗?
  • 有更好/更简单的解决方案吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)