您如何有效地实施文档相似性搜索系统?

时间:2010-02-03 10:36:32

标签: search similarity recommendation-engine cosine

如何为a描述的项目实现“类似项目”系统 一组标签?

在我的数据库中,我有三个表,Article,ArticleTag和Tag。每 文章通过多对多与许多标签相关 关系。对于每篇文章我想找到五个最相似的 文章实施“如果你喜欢这篇文章,你会喜欢这些 太“系统。

我熟悉Cosine similarity 并使用该算法非常有效。但这是缓慢的方式。对于 每篇文章,我需要迭代所有文章,计算出来 文章对的余弦相似度然后选择五个 相似度最高的文章。

有20万篇文章和30k标签,我需要半分钟 计算单篇文章的类似文章。所以我需要 另一种算法产生与余弦一样好的结果 相似性,但可以实时运行,不需要 我每次都要遍历整个文档语料库。

也许有人可以为此建议一个现成的解决方案?大多数 我看过的搜索引擎无法实现文档相似性 搜索。

2 个答案:

答案 0 :(得分:1)

有些问题,

  • ArticleTag与Tag有何不同?或者是M2M映射表?
  • 您能否勾勒出如何实现余弦匹配算法?
  • 为什么不将文档标签存储在某种内存数据结构中,仅使用它来检索文档ID?这样,您只能在检索期间点击数据库。
  • 根据文档添加的频率,此结构可以设计用于快速/慢速更新。

对答案的初步直觉 - 我会说,一个在线聚类算法(可能对共生矩阵进行主成分分析,它将近似于K均值聚类?)。一旦你回答了上面的一些问题,就会更好地完善。

干杯。

答案 1 :(得分:0)

您可以使用Lemur工具包执行此操作。使用KeyfileIncIndex,您必须从其来源重新检索文档; IndriIndex支持从索引中检索文档。

但无论如何,您索引文档,然后从要查找类似文档的文档构建查询。然后,您可以使用该查询进行搜索,并对其他文档进行相似性评分。根据我的经验,这是非常快的。它将源文档和基本查询都视为文档,因此找到相似之处就是它的功能(除非你使用的是Indri解析器的东西 - 这有点不同,我不确定它是如何工作的。)