每日读源码---Day1_processdata

def processdata(instance, noise_rate, passage_num, filename, correct_rate = 0):
	#instance: 一个字典,包含查询(query)、答案(answer)、正例(positive)、负例(negative)等信息。
	#从 instance 中提取 query 和 answer。
    query = instance['query']
    ans = instance['answer']
	#使用 math.ceil 计算负例数量 neg_num。并计算正例数量 pos_num。
    neg_num = math.ceil(passage_num * noise_rate)
    pos_num = passage_num - neg_num
	#根据文件名处理数据
    if '_int' in filename:
        for i in instance['positive']:
            random.shuffle(i)
        print(len(instance['positive']))
        docs = [i[0] for i in instance['positive']]
        if len(docs) < pos_num:
            maxnum = max([len(i) for i in instance['positive']])
            for i in range(1,maxnum):
                for j in instance['positive']:
                    if len(j) > i:
                        docs.append(j[i])
                        if len(docs) == pos_num:
                            break
                if len(docs) == pos_num:
                    break
        neg_num = passage_num - len(docs)
        if neg_num > 0:
            negative = instance['negative'][:neg_num]
            docs += negative
    elif '_fact' in filename:
        correct_num = math.ceil(passage_num * correct_rate)
        pos_num = passage_num - neg_num - correct_num
        indexs = list(range(len(instance['positive'])))
        selected = random.sample(indexs,min(len(indexs),pos_num))
        docs = [instance['positive_wrong'][i] for i in selected]
        remain = [i for i in indexs if i not in selected]
        if correct_num > 0 and len(remain) > 0:
            docs += [instance['positive'][i] for i in random.sample(remain,min(len(remain),correct_num))]
        if neg_num > 0:
            docs += instance['negative'][:neg_num]
    else:
        if noise_rate == 1:
            neg_num = passage_num
            pos_num = 0
        else:
            if neg_num > len(instance['negative']):
                neg_num = len(instance['negative'])
                pos_num = passage_num - neg_num
            elif pos_num > len(instance['positive']):
                pos_num = len(instance['positive'])
                neg_num = passage_num - pos_num
        positive = instance['positive'][:pos_num]
        negative = instance['negative'][:neg_num]
        docs = positive + negative
        
	#使用 random.shuffle 打乱 docs 列表的顺序。
    random.shuffle(docs)
    #返回处理后的 query、ans 和 docs。
    return query, ans, docs
  • instance: 一个字典,包含查询(query)、答案(answer)、正例(positive)、负例(negative)等信息。
  • noise_rate: 噪声率,用于确定负例文档的数量。
  • passage_num: 每个查询应该返回的文档数量,它决定了每个查询处理后应该包含多少文档。这个数量包括正例(包含答案的文档)和负例(不包含答案的文档)。通过 passage_num,可以控制正例和负例在最终数据集中的比例。例如,如果 passage_num 较大,而正例文档数量有限,可能需要添加更多的负例文档来达到这个数量,反之亦然。
  • filename: 文件名,用于确定处理数据的方式。
  • correct_rate: 正确率,用于确定正确文档的数量(默认值为0)。

根据文件名处理数据:

  • 如果文件名包含 _int
    • 打乱正例文档的顺序。
    • 从正例中选择 pos_num 个文档。
    • 如果正例数量不足,从正例中继续选择,直到达到 pos_num
    • 计算剩余需要的负例数量 neg_num
    • 如果需要负例,从 instance['negative'] 中选择 neg_num 个文档。
    • 将正例和负例合并到 docs 中。
  • 如果文件名包含 _fact
    • 计算正确文档的数量 correct_num
    • 从正例中随机选择 pos_num 个文档。
    • 如果还有剩余的正确文档,从剩余的正例中随机选择 correct_num 个文档。
    • 如果需要负例,从 instance['negative'] 中选择 neg_num 个文档。
    • 将所有文档合并到 docs 中。
  • 其他情况:
    • 根据 noise_rate 调整正例和负例的数量。
    • instance['positive']instance['negative'] 中选择相应数量的文档。
    • 将正例和负例合并到 docs 中。

processdata 函数通过结合原始数据和指定的参数,生成了一组新的数据,这组数据模拟了真实世界中的查询场景,包括噪声和正确答案的混合。这种数据生成方法有助于训练和评估模型在处理复杂、噪声数据时的性能,从而提高模型的鲁棒性和实用性。

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只天蝎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值