bm25算法中文短文匹配 基于结巴分词构建简单搜索引擎
Published on Aug. 22, 2023, 12:11 p.m.
bm25算法中文短文匹配
使用bm25算法排序,分词使用结巴。
https://github.com/dorianbrown/rank_bm25
安装依赖
!pip install rank_bm25 jieba
构建数据索引
from rank_bm25 import BM25Okapi
import jieba
corpus = [
"精确模式,试图将句子最精确地切开,适合文本分析;",
"全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;",
"搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。"
]
#分词处理
tokenized_corpus = [list(jieba.cut_for_search(doc)) for doc in corpus]
# 构建索引
bm25 = BM25Okapi(tokenized_corpus)
开始查询数据
query = "搜索引擎"
tokenized_query = list(jieba.cut_for_search(query))
doc_scores = bm25.get_scores(tokenized_query)
# 打印得分
doc_scores
array([0. , 0. , 2.68780875])
匹配相关句子
#获取匹配结果
bm25.get_top_n(tokenized_query, corpus, n=2)
['搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。',
'全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;']
第一个匹配还可以。idea:感觉整体不是很好,另外可以尝试使用(bert,word2vec)语言表示模型获取表示后,pca降维处理后排序稍微简单些,还是获取句子表示才是难点。
kaggle链接:
https://www.kaggle.com/code/terrychanorg/rank-bm25-notebook34e931b070?scriptVersionId=90676359