【问题标题】:How Do I Apply TF-IDF When I Only Have a Subset of the Total Documents?当我只有总文档的子集时如何应用 TF-IDF?
【发布时间】:2018-11-11 03:37:01
【问题描述】:

实际应用:

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

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

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

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

实际问题

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

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

额外问题

如果您有关于如何在不使用我自己的搜索解决方案或使用 Elasticsearch 的情况下完成此任务的建议,我会全力以赴......

【问题讨论】:

    标签: database elasticsearch search tf-idf


    【解决方案1】:

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

    有两个很棒的选择需要更多的工作(但不像编写自己的搜索解决方案那样多)。 Lucene 是编写 Elasticsearch 的实际搜索引擎。它仍然会将相当多的基础数据结构加载到内存中,因此,根据您要索引的基础数据的大小,它仍然可能会耗尽内存。但是,与整个 Elasticsearch 实例相比,您应该能够在单个 Lucene 索引中容纳更多的数据。

    另一种我不太了解的选择是狮身人面像。它也是一个搜索引擎。它还允许您指定分配多少内存供它使用。它将其余数据存储在磁盘上。

    【讨论】:

    • 谢谢!狮身人面像是我在对该主题进行了相当多的谷歌搜索后开始调查的。似乎它从一系列平面文件中构建了一个索引。早期的测试很有希望。谢谢回复! :)
    猜你喜欢
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 2021-03-24
    • 2011-03-19
    • 2021-02-06
    • 2017-02-27
    相关资源
    最近更新 更多