python - 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(当然,我使用了相同的参数,以及对不同参数的彻底探索,以寻求更好的匹配)。
这是可以预料的吗?还是我应该假设这是我的错?
解决方案
事实上,最新的 elasticsearch 默认使用与 TF/IDF 略有不同的算法,即 BM25。请参阅https://www.elastic.co/guide/en/elasticsearch/reference/7.3/similarity.html
推荐阅读
- python - 检查ManyToMany字段django rest框架中的对象是否
- jmeter - 方法 executeScript( java.lang.String, org.openqa.selenium.remote.RemoteWebElement )
- python - 获取此错误唯一约束失败:store_order.id
- python - 用逗号分割子串并用每个子串分隔行
- php - laravel 登录表单中的身份验证问题
- reactjs - 反应日期选择器未设置日期
- javascript - 如何使用javascript从url获取域名
- google-sheets - Google 表格查询总和计数列
- android - Android 启动器中的双应用程序
- javascript - JSON 数组按内部属性过滤