返回向量空间模型中表示的相似文档的算法

发布于 2024-11-16 14:53:23 字数 256 浏览 5 评论 0原文

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

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

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

经验丰富的用户的任何建议和帮助将不胜感激。

谢谢你,

凯蒂

I have a DB containing tf-idf vectors of about 30,000 documents.

I would like to return for a given document a set of similar documents - about 4 or so.

I thought about implementing a K-Means (clustering algorithm) on the data (with cosine similarity), but I don't know whether it's the best choice because of many uncertainties: I'm not sure what to put in my initial clusters, I don't know how many clusters to create, I fear the clusters will be too unbalanced, I'm not sure the results quality will be good, etc.

Any advice and help from experienced users will be greatly appreciated.

Thank you,

Katie

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

陌生 2024-11-23 14:53:23

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

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

I would like to return for a given document a set of similar documents - about 4 or so.

Then don't do k-means. Just return the four closest documents by tf-idf similarity, as any search engine would do. You can implement this as a k-nearest neighbor search, or more easily by installing a search engine library and using the initial document as a query. Lucene comes to mind.

氛圍 2024-11-23 14:53:23

如果我理解,您

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

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

  1. 读取或缓存:多久执行一次,
    30k 个向量总共有多大?
  2. 10 * 30k 乘加:在您的 c / java / ... 或某些不透明的数据库中?
    在 c 或 java 中,应该采用 < 1秒。

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

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

If I understand, you

  1. read 30k records from a bigger db to a cache file / to memory
  2. cosine similarity, 10 terms * 30k records -> best 4.

Can you estimate the runtimes of these phases separately ?

  1. read or cache: how often will this be done,
    how big are the 30k vectors all together ?
  2. 10 * 30k multiply-adds: in your c / java / ... or in some opaque db ?
    In c or java, that should take < 1 second.

In general, make some back-of-the-envelope estimates
before getting fancy.

(By the way,
I find best-4 faster and simpler in straight-up c than std::partial_sort; ymmv.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文