确定数据库中项目之间的相似性

时间:2011-12-15 21:29:20

标签: artificial-intelligence nlp search-engine data-mining full-text-indexing

我们拥有一个包含数亿条日志数据记录的数据库。我们正在尝试组织'此日志数据可能与日志数据库中的其他条目具有相同的性质。例如:

记录X可能包含一个日志条目,如:

  

更改交易ABC123分配给服务器US91

记录Y可能包含一个日志条目,如:

  

更改事务XYZ789分配给服务器GB47

对于我们这些人来说,这两个日志条目很容易被识别为可能以某种方式相关。现在,在记录X和记录Y之间可能有1000万行。并且可能有数千个其他条目类似于X和Y,有些条目完全不同但有其他类似的记录。

我试图确定的是将类似项目组合在一起的最佳方式,并说XX%确定性记录X和记录Y可能具有相同的性质。或者更好的方式是说系统会查看记录Y并根据你的内容说出你最喜欢的记录X与所有其他记录相关。

我已经看到了一些关于自然语言处理的提及以及其他找到字符串之间相似性的方法(比如只是粗暴地强迫一些Levenshtein计算) - 但是对于我们来说,我们还有另外两个挑战:

  1. 内容是机器生成的 - 而非人为生成
  2. 与我们确定给定查询结果的搜索引擎方法相反 - 我们正在尝试对巨型存储库进行分类,并根据它们彼此的相似程度对它们进行分组。
  3. 感谢您的投入!

5 个答案:

答案 0 :(得分:1)

有趣的问题。显然,这里存在一个规模问题,因为您并不真的想开始将每个记录与DB中的每个其他记录进行比较。我相信我会考虑增加一个“已知类型”列表,并根据该列表中的类型对记录进行评分,以查看每个记录在该列表中是否匹配。

“得分”部分有望在这里得出一些好的答案 - 你对已知类型得分的能力是让这个能够很好地运作的关键,我觉得你处于比我们得到更好的位置那是对的。也许某种soundex比赛?或者,如果您可以弄清楚如何“发现”新记录的哪些部分发生变化,您可以将已知类型定义为正则表达式。

此时,对于每条记录,您可以确定您已经匹配(具有高置信度)或匹配(置信度较低)或者很可能完全没有匹配。在最后一种情况下,您可能已经找到了应该添加到“已知类型”列表中的新“类型”。如果你跟踪你匹配的每条记录的得分,你也可以回到低得分的比赛,看看你的处理后期是否出现了更好的比赛。

答案 1 :(得分:1)

我建议使用像Lucene这样的文本搜索引擎将数据编入索引,以将日志条目拆分为术语。由于您的数据是机器生成的,因此使用单词bi​​grams和tigrams,甚至更高阶n-gram。二元组只是一系列连续的单词,在您的示例中,您将拥有以下双字母:

Change_Transaction, Transaction_XYZ789, XYZ789_Assigned, Assigned_To, To_Server, Server_GB47

对于每个日志以类似的方式准备查询,搜索引擎可能会给您最相似的结果。您可能需要稍微调整相似度函数以获得最佳结果,但我相信这是一个良好的开端。

答案 2 :(得分:1)

我想到了两个主要策略:

  1. ad-hoc。使用信息检索方法。构建日志条目的索引,最终使用专门的标记器/解析器,将它们提供给常规的文本搜索引擎。我听过人们用Xapian和Lucene做过这件事。然后你可以"搜索"对于新的日志记录和文本搜索引擎将(希望)返回一些相关的日志条目以与之进行比较。通常是"信息检索"然而,方法只对找到10个最相似的结果感兴趣。

  2. 聚类方法。您通常需要将数据转换为数字向量(但可能是稀疏的),例如作为TF-IDF。然后,您可以应用聚类算法来查找密切相关的行组(例如上面给出的示例),并研究它们的性质。你可能需要稍微调整一下,所以它没有例如服务器ID上的集群。

  3. 这两种策略都有起伏。第一个是非常快的,但是它总是只返回一些类似的现有日志行,没有太多关于这条线的常见数量。它主要用于人体检查。

    第二种策略是计算密集型的,并且取决于您的参数可能完全失败(因此可能首先在子集上测试它),但也可以通过实际构建非常密切相关的大型日志条目组来提供更有用的结果

答案 3 :(得分:0)

听起来你可以采用上面提到的lucene方法,然后将其用作机器学习库Mahout(http://mahout.apache.org/)中输入向量的源。在那里,您可以训练分类器,或者只使用其中一种聚类算法。

答案 4 :(得分:-2)

如果您的DBMS有,请查看SOUNDEX()。