稀疏向量BM25Retriever不支持中文怎么办?jieba来帮忙

稀疏向量

稀疏向量 :稀疏向量也叫"词法向量"。是基于词频统计的检索方法,简单理解就是统计某一个词在一篇文章中出现的次数。缺点是无法理解语义。常用的算法有:BM25。

在LangChain中使用BM25Retriever进行搜索

python 复制代码
from langchain_community.retrievers import BM25Retriever

# BM25检索器  
bm25_retriever = BM25Retriever.from_documents(  
    chunks,  
    k=5
)

# 使用bm25_retriever进行向量搜索
bm25_docs = bm25_retriever.invoke("这里是搜索的关键字")

如果多次执行上面这段代码,你可能会发现一个问题。即使换了搜索关键字,搜索出来的内容还是一样的。这是因为BM25Retriever默认的分词器不支持对中文进行分词。

向量化

使用BM25Retriever进行搜索时,不需要提前将待搜索的内容向量化。因为BM25Retriever 是一个基于关键词的检索器 。核心是统计和匹配 ,而不是"理解"语义。完全基于词项的精确匹配和统计 。只有文档中精确出现目标词汇时,这个词才会被匹配。

当要搜索的内容(chunks)非常多时,可以使用Elasticsearch / OpenSearch 等专业软件。Elasticsearch内置了成熟的 BM25 实现。或者使用bm25s等第三方库。

安装jieba这个库

安装jieba这个中文分词器库。

python 复制代码
uv add jieba

from langchain_community.retrievers import BM25Retriever  
from langchain_core.documents import Document  
import jieba

# 给BM25Retriever指定中文分词器jieba.cut(x)
bm25_retriever = BM25Retriever.from_documents(  
    self.chunks,  
    k=5,  
    preprocess_func= lambda x: list(jieba.cut(x)),  
)

# 使用bm25_retriever进行向量搜索
bm25_docs = bm25_retriever.invoke("这里是搜索的关键字")

jieba是干什么的?

python 复制代码
import jieba  
  
print(jieba.lcut("南京市长江大桥"))  
  
print(jieba.lcut("what are you doing?"))  
  
for item in jieba.cut("南京市长江大桥"):  
    print(item)
相关推荐
一只爱撸猫的程序猿44 分钟前
我看着一个 AI 引擎在 14 天里,从"记忆"走进了"搜索"
人工智能·后端·架构
LucianaiB1 小时前
【元宝搜索开发者征文大赛】AI时代,学得慢就不用学?用元宝搜索打造一个教程保质期,确保每一个教程符合你的现状
前端·人工智能·ai编程
excel2 小时前
JavaScript 对象池:减少高频对象创建与 GC 压力
前端
陈随易3 小时前
纯 Go 写的 JS 引擎,跑分超过了 C 语言的 QuickJS
前端·后端·程序员
卷无止境4 小时前
RAGFlow 项目全景报告:从文档解析引擎到 Agent 原生数据库
后端·python
小Z先生5 小时前
我用 Go + 系统 WebView 写了个纯本地 Postman:不装 Electron、不连云端
后端·github
子兮曰5 小时前
Chrome 权限元素实战:144 与 151 的渐进增强写法
前端·javascript·chrome
IT_陈寒5 小时前
Redis连接池泄漏那次,我差点把生产环境搞崩了
前端·人工智能·后端
强尼银手5 小时前
我花一天做了个格斗游戏原型,判定全对,然后被「美术」劝退了
前端·javascript
灿飞屋5 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓