代码之家  ›  专栏  ›  技术社区  ›  Gaslight Deceive Subvert

如何高效地实现文档相似性搜索系统?

  •  4
  • Gaslight Deceive Subvert  · 技术社区  · 16 年前

    您如何为客户描述的项目实施“类似项目”系统 一套标签?

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

    我熟悉 Cosine similarity 使用这种算法效果很好。但这是一种减缓的方式。对于 每一篇文章,我需要迭代所有的文章,计算 文章对的余弦相似性,然后选择五个 相似度最高的文章。

    有了20万篇文章和3万个标签,我花了半分钟就完成了 计算一篇文章的类似文章。所以我需要 另一种算法产生的结果大致和余弦一样好 相似性,但它可以实时运行,不需要 每次我都要反复浏览整个文档语料库。

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

    2 回复  |  直到 12 年前
        1
  •  1
  •   viksit    16 年前

    有些问题,

    • ArticleTag和Tag有何不同?还是M2M映射表?
    • 你能描述一下你是如何实现余弦匹配算法的吗?
    • 为什么不将文档标记存储在内存中的某种数据结构中,只用于检索文档ID?这样,您只能在检索时访问数据库。
    • 根据文档添加的频率,此结构可以设计为快速/慢速更新。

    对答案的最初直觉——我想说,是一个在线聚类算法(也许对共现矩阵进行主成分分析,这将近似于K均值聚类?)。一旦你回答了上面的一些问题,你就会变得更加精练。

    干杯

        2
  •  0
  •   Michael Ekstrand    16 年前

    你可以用 Lemur 工具箱。带着它的 KeyfileIncIndex ,您必须从其来源重新检索文档;这个 IndriIndex 支持从索引中检索文档。

    但不管怎样,您需要为文档编制索引,然后从要查找类似文档的文档中构建一个查询。然后,您可以使用该查询进行搜索,它将为其他文档的相似性评分。根据我的经验,这很快。它将源文档和基本查询都视为文档,所以查找相似性才是它真正要做的(除非你使用的是Indri解析器的东西——这有点不同,我不确定它是如何工作的)。