大一还沉迷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(["你好世界"])
结果: