我们有一个包含数亿条日志数据记录的数据库。我们试图“分组”这些日志数据,使其与日志数据库中的其他条目具有相似的性质。例如:
记录 X 可能包含如下日志条目:
变更事务 ABC123 分配给服务器 US91
记录 Y 可能包含如下日志条目:
变更事务 XYZ789 分配给服务器 GB47
对我们人类来说,很容易识别出这两个日志条目在某种程度上可能是相关的。现在,记录 X 和记录 Y 之间可能存在 1000 万行数据。并且可能存在数千个与 X 和 Y 相似的其他条目,以及一些完全不同但与其他记录相似的条目。
我试图确定将相似项分组在一起的最佳方法,并以 XX% 的确定性表示记录 X 和记录 Y 可能具有相同的性质。或者,更好的一种说法是,系统会查看记录 Y,并根据其内容,告诉你它与记录 X 最相似,而不是与其他所有记录相似。
我看到一些关于自然语言处理和其他查找字符串之间相似性的方法(例如,蛮力计算一些 Levenshtein 距离)的提及 – 但是对于我们来说,我们还有以下两个额外的挑战:
- 内容是机器生成的 – 而不是人类生成的
- 与搜索引擎方法(我们确定给定查询的结果)相反 – 我们试图对一个巨大的存储库进行分类,并根据它们彼此的相似程度对它们进行分组。
感谢您的意见!
回答:
有趣的问题。 显然,这里存在规模问题,因为您肯定不想开始将数据库中的每个记录与每个其他记录进行比较。 我认为我会考虑建立一个“已知类型”列表,并根据该列表中的类型对记录进行评分,以查看每个记录是否在该列表中有匹配项。
“评分”部分有望在这里获得一些好的答案——您针对已知类型进行评分的能力是使其能够良好工作的关键,并且我感觉您比我们更适合做好这一点。 某种 Soundex 匹配? 或者,如果您可以弄清楚如何“发现”新记录的哪些部分发生了变化,则可以将已知类型定义为正则表达式。
在这一点上,对于每条记录,您可以希望确定您已找到匹配项(具有很高的置信度)或匹配项(具有较低的置信度)或很可能根本没有匹配项。 在最后一种情况下,您可能找到了应该添加到“已知类型”列表中的新“类型”。 如果您跟踪每条匹配记录的分数,您也可以返回到低分匹配项,看看稍后在您的处理中是否出现了更好的匹配项。