5

您如何为一组标签描述的项目实施“相似项目”系统?

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

我熟悉余弦相似度 ,并且使用该算法效果很好。但这是慢下来的方式。对于每篇文章,我需要遍历所有文章,计算文章对的余弦相似度,然后选择相似度最高的五篇文章。

200k 篇文章和 30k 个标签,我需要半分钟来计算一篇文章的相似文章。所以我需要另一种算法,它可以产生与余弦相似度大致一样好的结果,但它可以实时运行,并且不需要我每次都迭代整个文档语料库。

也许有人可以为此提出现成的解决方案?我查看的大多数搜索引擎都没有启用文档相似性搜索。

4

2 回答 2

1

一些问题,

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

对答案的初步直觉 - 我会说,一种在线聚类算法(也许对共现矩阵进行主成分分析,这将近似于 K-means 聚类?)。一旦你回答了上面的一些问题,就会得到更好的改进。

干杯。

于 2010-02-04T21:45:45.300 回答
0

您可以使用Lemur工具包来完成。使用它KeyfileIncIndex,您必须从其源重新检索文档;IndriIndex支持从索引中检索文档。

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

于 2010-03-19T01:49:00.260 回答