当我只有全部文档的一个子集时,如何应用 TF-IDF?

How Do I Apply TF-IDF When I Only Have a Subset of the Total Documents?

实际应用:

我有几个数据库需要从一个搜索框中查询。其中一些我可以直接访问(它们是 SQL 服务器/MySQL),其他我只能通过 API 搜索。

在理想情况下,我会将所有这些数据注入 Elasticsearch 并使用它来确定相关性。不幸的是,我没有本地资源来有效地 运行 。 Elastic 在空闲时占用了超过 400mb 的 RAM,而没有添加任何实际数据或 运行ning 查询。看起来大多数在生产中使用 Elasticsearch 的人都是 运行 配备 32GB - 64GB RAM 的机器。我的组织无权访问此项目可用的任何强大功能。

所以我的下一个想法是查询所有数据库并在用户进行搜索时连接到 API。然后我需要分析结果,确定相关性,并将它们 return 提供给用户。我认识到,就性能而言,这可能是一个糟糕的计划。我希望使用 memcached 让事情变得更容易接受。

在寻找确定相关性的算法的研究中,我遇到了 tf-idf。我希望将其应用于我从所有数据库返回的结果。

真题

我对 tf-idf 的理解是,在对语料库中的每个文档进行分词后,执行词频分析,然后将其与词的逆文档频率相乘。逆文档频率的计算方法是将文档总数除以包含该词的文档总数。

问题在于,如果我从 API 中提取文档,我不知道语料库中文档的真实总数。我只提取了一个子集,根据提取这些文档的方式,它们自然会使用其中的所有术语。我仍然可以通过将这些不同来源编辑的文档池 return 视为一个语料库来应用 tf-idf 吗?最好的方法是什么?

加分题

如果您有关于如何在不拼凑我自己的搜索解决方案或使用 Elasticsearch 的情况下完成此任务的建议,我会洗耳恭听...

正如您所注意到的,Elasticsearch 并非针对内存受限环境中的 运行 而构建。如果您想使用 Elasticsearch,但无法设置专用机器,您可以考虑使用托管搜索解决方案(例如 AWS Elasticsearch、Elastic Cloud、Algolia 等)。不过,这些解决方案仍然需要成本!

有两个很棒的替代方案需要更多的工作(但不如编写您自己的搜索解决方案那么多)。 Lucene 是 Elasticsearch 在其之上编写的实际搜索引擎。它仍然会将相当多的底层数据结构加载到内存中,因此,根据您要索引的底层数据的大小,它仍然可能 运行 内存不足。但是,与整个 Elasticsearch 实例相比,您应该能够在单个 Lucene 索引中容纳更多的数据。

另一个我不太了解的替代方案是 Sphinx。它也是一个搜索引擎。它还允许您指定分配多少内存供其使用。它将其余数据存储在磁盘上。