BM25唱罢,BMX登场!

技术

论文笔记分享,论文标题,BMX: Entropy-weighted Similarity and Semantic-enhanced Lexical Search。代码仓库:https://github.com/mixedbread-ai/baguetter

大多数文本搜索引擎背后的算法多多少少都跟BM25沾边,BM25的主要优势在于,它在分布之外的数据中表现得非常好,也就是说它可以很好的处理以前从未见过的数据。但是!关键字搜索方法有其自身的局限性:

  • BM25 不考虑查询与任何给定文档之间的相似性,这可以更准确地评估该文档与查询的相关性。
  • 词汇搜索算法缺乏语义理解,因此无法处理同义词和同音异义词等语言细微差别。与基于特定领域文本嵌入的语义搜索相比,这种限制是词法搜索性能不佳的关键因素。

于是本文提出了BMX,计算简单,效果优于所有的BM25变种,建索引,搜索都不会明显慢,但是效果明显好!

picture.image


        
          
# 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,词频*逆文档率

picture.image

picture.image

picture.image

tfidf很好了,但是词频score F(qi,D)是一个线性的分数,也就是说,如果一个token出现频率比另一个多 5 倍,则其 TF 值将比另一个大 5 倍,然后BM25就对这里做了优化

picture.image

BMX 在 BM25 之上,利用熵加权相似度对其进行增强,以实现查询和文档之间更精确的相关性评估,可以简单表达为:

picture.image

picture.image

picture.image

picture.image

与基于嵌入的方法相比,包括 BM25 和 BMX 在内的词法搜索算法的一大缺点是缺乏对查询的语义理解,因为它们仅基于查询标记来检索文档,而忽略了同义词和同音异义词等。为了解决这个限制,可以通过手动制作同义词和同音异义词的集合来完成查询增强。在这里,我们建议使用LLM来增强查询。

picture.image这种加权查询增强 (WQA) 模式可以结合对查询的语义理解LLM词法搜索算法,同时仍然保持其计算效率。

最后性能测试picture.image

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
火山引擎大规模机器学习平台架构设计与应用实践
围绕数据加速、模型分布式训练框架建设、大规模异构集群调度、模型开发过程标准化等AI工程化实践,全面分享如何以开发者的极致体验为核心,进行机器学习平台的设计与实现。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论