【问题标题】:Differences in Sklearn and Elasticsearch results for TFIDFTFIDF 的 Sklearn 和 Elasticsearch 结果的差异
【发布时间】:2019-08-29 00:06:41
【问题描述】:

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

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

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

但是,结果非常不同!我刚刚实现了vector-based search,这是 Elasticsearch 7.3 中允许的。这让我可以获取 Sklearn 向量并在 Elasticsearch 中使用它们。我的结果不完全相同,但非常接近(正如预期的那样,类似于我希望通过 Elasticsearch MoreLikeThis 查询看到的结果!)。因此,显然 Elasticsearch 中的 TFIDF 不像在 Sklearn 中那样工作。

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

这是意料之中的吗?还是我应该认为这是我的错?

【问题讨论】:

    标签: python elasticsearch scikit-learn


    【解决方案1】:

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

    【讨论】:

    • 我在那个链接中看到BM25是默认的,但我可以切换到TFIDF......这很有趣。如果是这样的话,我应该能够得到更多类似的结果。我会检查的。
    • 显然部分文档已过时,并且 TFIDF 选项不再可用,所以我无法获得我正在寻找的确切证据,但看起来您确实是正确的。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多