自学内容网 自学内容网

Baseline_bm25实现文本检索

大一还沉迷NLP时写的第一篇笔记,才发现在草稿箱躺了这么久oO

题目来源:飞桨AI Studio - 人工智能学习与实训社区 (baidu.com)

1.解压数据集

!unzip /home/aistudio/data/data205651/wenshu_ms_dataset.zip -d dataset

如果已经解压过了出现,但是在.py里面不能输出!

 所以跑到终端去试试,但是显示 “!unzip: event not found”【雾,待解决】

 2.定义一个读取数据集的函数

主要作用是收集【wenshu_dataset, wenshu_keys】这两个列表

每行代码都有非常详细的解释!因为我真的太菜了!

from tqdm import tqdm    #进度条模块
import os, json
# 读取数据集
def load_dataset(dataset_path):
    wenshu_dataset = []                     #创建空列表
    wenshu_keys = []       
    dataset_dir = os.listdir(dataset_path)  #使用os模块的listdir函数,获取dataset_path参数指定的目录下的所有文件名,并将其存储变量dataset_dir
    for dir in tqdm(dataset_dir):           #对dataset_dir中的每个文件名进行遍历,并使用tqdm模块的函数来显示循环的进度
        #以只读模式(r)和指定的编码(utf-8)打开dataset_path和dir拼接后的文件路径,并将其赋值给变量f
        with open(os.path.join(dataset_path, dir), 'r', encoding='utf-8') as f:  
            data = json.load(f)             #使用json模块的load函数,从打开的文件中读取JSON格式的数据,并将其赋值给变量data
            wenshu_dataset.append(data)     #将读取到的数据添加到wenshu_dataset列表的末尾
            wenshu_keys.append(dir[:-5])    #保存key
            f.close()                       #with会默认文件使用完毕后自动关闭
    return wenshu_dataset, wenshu_keys      #返回了两个列表:包含所有数据集的列表和包含所有key的列表

3.预处理——停用词&分词

import sys                                   #system
sys.path.append("../utils")                  #添加utils文件夹
from utils.BM25 import BM25Okapi as bm25     #导入BM25
import jieba                                 #导入jieba——中文分词
import numpy as np                           #导入numpy——基础数值计算
from tqdm import tqdm                        #导入进度条模块
stopwords = []                               #定义停止词列表
with open(r'utils/stopwords.txt', encoding='utf-8') as file:  #打开文件,读取停止词
    for line in file.readlines():            #遍历文件,读取每一行
        stopwords.append(line.strip('\n'))   #使用numpy来创建numpy矩阵,其形状为(wordSize)

with open(r'utils/stopword.txt', encoding='utf-8') as file:
    for line in file.readlines():
        stopwords.append(line.strip('\n'))   #去掉字符串末尾的换行符
stopwords = list(set(stopwords))             #将一个列表中的重复元素去重,set将列表转换为集合(去重),list再把集合转换回列表

def token_split(data):
    #cut_all为True时,表示使用全模式进行分词,即把文本中所有可能的词语都扫描出来,对于存在歧义的词语,会进行所有可能的切分,速度较快,但精度较低;
    #cut_all为False时,表示使用精确模式进行分词,即根据前缀词典和后缀词典进行切分,精度较高,但速度较慢
    data_cut = [jieba.lcut(i, cut_all=False) for i in data]  # lcut对输入的每一条文本数据进行分词
    result_cut = [[i for i in d if not i in stopwords] for d in data_cut]  # 去停用词
    return result_cut

def get_scores_bm25(text_q: str, texts_c: list):    #计算一个查询文本和多篇文本之间的BM25相似度分数
    q_cut = token_split([text_q])[0]                # 清洗、分词
    c_cut = token_split(texts_c)                    # 清洗、分词
    model_bm25 = bm25(c_cut)                        # 使用bm25()方法计算出文本集合的BM25模型
    score = np.array(model_bm25.get_scores(q_cut))
    return score
token_split(["你好世界"])

结果:


原文地址:https://blog.csdn.net/Kixuan214/article/details/130381256

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!