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