首页 > 解决方案 > TFIDF 的 Sklearn 和 Elasticsearch 结果的差异

问题描述

我正在研究文档相似性。我的第一种方法是使用 Sklearn 的 TFIDF 算法实现。结果很好,但是对于许多文档的搜索速度很慢。

然后我设置了 Elasticsearch,elasticsearch_dsl在 Python 中使用。我知道我的查询也在使用 TFIDF:

s = s.query(MoreLikeThis(like=string,
                         fields=fields,
                         min_doc_freq=100,
                         max_doc_freq=175000))

然而,结果却大不相同!我刚刚实现了 Elasticsearch 7.3 中允许的基于向量的搜索。这让我可以获取 Sklearn 向量并在 Elasticsearch 中使用它们。我的结果并不完全相同,但非常接近(正如预期的那样,类似于我希望通过 ElasticsearchMoreLikeThis查询看到的结果!)。所以很明显 Elasticsearch 中的 TFIDF 不像在 Sklearn 中那样工作。

在此处输入图像描述 此图像显示查询的分数。左侧是 Elasticsearch 中 Sklearn 与 Sklearn 向量的得分。在右边,使用我上面的查询的 Sklearn 与 Elasticsearch(当然,我使用了相同的参数,以及对不同参数的彻底探索,以寻求更好的匹配)。

这是可以预料的吗?还是我应该假设这是我的错?

标签: pythonelasticsearchscikit-learn

解决方案


事实上,最新的 elasticsearch 默认使用与 TF/IDF 略有不同的算法,即 BM25。请参阅https://www.elastic.co/guide/en/elasticsearch/reference/7.3/similarity.html


推荐阅读