论文笔记分享,论文标题,BMX: Entropy-weighted Similarity and Semantic-enhanced Lexical Search。代码仓库:https://github.com/mixedbread-ai/baguetter
大多数文本搜索引擎背后的算法多多少少都跟BM25沾边,BM25的主要优势在于,它在分布之外的数据中表现得非常好,也就是说它可以很好的处理以前从未见过的数据。但是!关键字搜索方法有其自身的局限性:
- BM25 不考虑查询与任何给定文档之间的相似性,这可以更准确地评估该文档与查询的相关性。
- 词汇搜索算法缺乏语义理解,因此无法处理同义词和同音异义词等语言细微差别。与基于特定领域文本嵌入的语义搜索相比,这种限制是词法搜索性能不佳的关键因素。
于是本文提出了BMX,计算简单,效果优于所有的BM25变种,建索引,搜索都不会明显慢,但是效果明显好!
# pip install baguetter
from baguetter.indices import BMXSparseIndex
# Initialize BM𝒳 index
bmx = BMXSparseIndex()
# Add bakery items to the index
docs = [
"Freshly crusty baked sourdough bread with a crispy crust",
"Flaky croissants made with French butter",
"Chocolate chip cookies with chunks of dark chocolate",
"Cinnamon rolls with cream cheese frosting",
"Artisanal baguettes with a soft interior and crusty exterior"
]
keys = list(range(len(docs)))
bmx.add_many(keys=keys, values=docs)
# Search for bread
query = "crusty bread"
results = bmx.search(query, top_k=2)
print(results)
# SearchResults(keys=[0, 4], scores=array([2.5519667 , 0.97304875], dtype=float32), normalized=False)
接下来看看计算原理和效果,先得看看tfidf,词频*逆文档率
tfidf很好了,但是词频score F(qi,D)是一个线性的分数,也就是说,如果一个token出现频率比另一个多 5 倍,则其 TF 值将比另一个大 5 倍,然后BM25就对这里做了优化
BMX 在 BM25 之上,利用熵加权相似度对其进行增强,以实现查询和文档之间更精确的相关性评估,可以简单表达为:
与基于嵌入的方法相比,包括 BM25 和 BMX 在内的词法搜索算法的一大缺点是缺乏对查询的语义理解,因为它们仅基于查询标记来检索文档,而忽略了同义词和同音异义词等。为了解决这个限制,可以通过手动制作同义词和同音异义词的集合来完成查询增强。在这里,我们建议使用LLM来增强查询。
这种加权查询增强 (WQA) 模式可以结合对查询的语义理解LLM词法搜索算法,同时仍然保持其计算效率。
最后性能测试 :