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

related content