【问题标题】:Algorithm for returning similar documents represented in Vector space model返回向量空间模型中表示的相似文档的算法
【发布时间】:2011-09-19 15:49:36
【问题描述】:

我有一个包含大约 30,000 个文档的 tf-idf 向量的数据库。

我想为给定文档返回一组相似的文档 - 大约 4 个左右。

我考虑过对数据(具有余弦相似度)实施 K-Means(聚类算法),但由于存在许多不确定性,我不知道这是否是最佳选择:我不知道该放什么初始集群,我不知道要创建多少个集群,我担心集群会太不平衡,我不确定结果质量会不会好,等等。

非常感谢有经验的用户提供的任何建议和帮助。

谢谢,

凯蒂

【问题讨论】:

  • 你的向量有多稀疏。即每个文档/每个查询的平均术语数?
  • 非常稀疏。大约有 30,000 个不同的 2-4 页文档。
  • 查询有多稀疏?例如。 5 个术语 => 30k cos distnces 需要时间 ~ 5 * 30k,够快吗?
  • 时间还包括从数据库中检索 30k 文档向量,然后计算给定文档与所有其他 30k 文档之间的 cos 距离。向量中的平均项数为 10。

标签: cluster-analysis document k-means tf-idf


【解决方案1】:

我想为给定文档返回一组相似的文档 - 大约 4 个左右。

那么不要做k-means。只需按 tf-idf 相似性返回四个最接近的文档,就像任何搜索引擎一样。您可以将其实现为 k-最近邻搜索,或者通过安装搜索引擎库并将初始文档用作查询来更轻松地实现。 Lucene 浮现在脑海中。

【讨论】:

  • 我担心实时从30,000个语料库中计算最接近的文档效率低下,另一方面保存所有文档之间的所有相似性结果会占用太多空间。
  • @Katie D:你害怕,但你试过了吗? 30.000 个文档根本不算多,即使它们是书本大小。由于它的迭代性质,只有 k-means 在这样的集合上可能会很慢。
  • 但我不确定它不会低效。如果我获取所有文档向量(一次将其存储在缓存中,或者每次我想查找类似文档时),我将需要在数据库中查询 30,000 个向量,然后将它们存储在内存中以便我可以迭代在他们。你的意思是我应该这样做吗?
【解决方案2】:

如果我明白,你

  1. 从更大的数据库中读取 30k 条记录到缓存文件/内存中
  2. 余弦相似度,10 个词条 * 30k 条记录 -> 最佳 4。

你能分别估计这些阶段的运行时间吗?

  1. 读取或缓存:多久执行一次, 30k 个向量加起来有多大?
  2. 10 * 30k 乘加:在您的 c / java / ... 或一些不透明的数据库中? 在 c 或 java 中,这应该花费

一般来说,做一些粗略的估计 变得花哨之前。

(顺便说一句, 我发现 best-4 在直接 c 中比 std::partial_sort; 更快更简单; ymmv。)

【讨论】:

  • 感谢您的回答。我将测试将所有向量保存在内存中需要多少空间,以及计算速度有多快。如果有有趣的结果,我会把它们发回给你。
  • 拜托——这里的大多数人都对实际结果感兴趣。
猜你喜欢
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2012-03-17
  • 2013-10-24
相关资源
最近更新 更多