Datawhale AI 夏令营大模型微调 ----task1

CSDN 2024-09-12 14:01:02 阅读 90

目录

1.1 语文问答数据制作

1.2 英语问答制作


<code>

#openpyxl(可读写excel表)专门处理Excel2007及以上版本产生的xlsx文件,xls和xlsx之间转换容易

!pip install pandas openpyxl

# 引入机器学习库pandas

#引入正则表达式

import pandas as pd

import re

# 读取训练集-语文.xlsx文件

df = pd.read_excel('训练集-语文.xlsx')

df = df.replace('.', '.', regex=True)

df = df.replace('(', '(', regex=True)

# 读取第二行(即第三行)“选项”列的内容

second_row_option_content = df.loc[2, '选项']

# 显示第二行“选项”列的内容

print(second_row_option_content)

import re # 导入Python的正则表达式库,用于文本匹配和提取

def chinese_multiple_choice_questions(questions_with_answers):

"""

解析包含中文选择题和简答题的文本,将其分解为两个列表:选择题列表和简答题列表。

参数:

questions_with_answers (str): 包含题目和答案的文本字符串,可能包含多种题型。

返回:

list: 一个包含选择题的字典列表,每个字典包含'question'和'choices'键。

注意:当前实现只返回选择题列表,简答题列表未返回,可能需要修改以返回两者。

"""

# 将输入的文本赋值给局部变量,以便后续处理

text = questions_with_answers

# 定义正则表达式模式,用于匹配问题文本

question_pattern = re.compile(r'\d+\..*?(?=\d+\.|$)', re.DOTALL)

# 定义正则表达式模式,用于匹配选择题的选项

choice_pattern = re.compile(r'([A-D])\s*(.*?)(?=[A-D]|$|\n)', re.DOTALL)

# 使用正则表达式在文本中查找所有匹配问题模式的字符串

questions = question_pattern.findall(text)

# 初始化两个空列表,分别用于存储选择题和简答题

multiple_choice_questions = []

short_answer_questions = []

# 遍历找到的所有问题

for id, question in enumerate(questions):

# 使用正则表达式检查问题文本中是否包含大写字母A-D,以判断是否为选择题

if re.search(r'[A-D]', question):

# 使用choice_pattern提取所有选项

choices = choice_pattern.findall(question)

# 分割问题文本以获取纯问题部分

# 这里假设问题文本中不包含换行符或括号内的内容,否则需要更复杂的处理

question_text = re.split(r'\n', question.split('(')[0])[0]

# 定义正则表达式以匹配问题编号和问题文本

# (\d+)\. 匹配数字后跟一个点,表示问题编号

# (.*) 匹配任意字符,表示问题文本

pattern_question = re.compile(r'(\d+)\.(.*)')

# 查找匹配的问题编号和问题文本

matches_question = pattern_question.findall(question_text)[0]

# 重新格式化问题编号和文本,这里使用str(id+1)来重置问题编号

formatted_question = str(id+1) + '.' + matches_question[1]

# 将格式化后的问题和选项添加到选择题列表中

multiple_choice_questions.append({

'question': formatted_question,

'choices': choices

})

else:

# 如果不是选择题,则将其添加到简答题列表中

short_answer_questions.append(question.strip())

# 注意:当前实现只返回了选择题列表,如果需要同时返回简答题列表,可以修改此处的返回语句

return multiple_choice_questions

定义的chinese_multiple_choice_questions该函数的主要逻辑是通过正则表达式匹配和提取文本中的问题和选项。对于选择题,它提取了问题的编号、文本和选项,并将它们存储在一个字典中。对于简答题,它只提取了问题的文本,并去除了前后的空白字符。函数当前只返回了选择题列表,如果需要同时处理简答题,可以修改函数以返回两个列表。

questions_list = [] for data_id in range(len(df[:3])): second_row_option_content = df.loc[data_id, '选项'] questions_list.append(chinese_multiple_choice_questions(second_row_option_content))

这段代码首先导入了 pandas 库,然后初始化了一个空列表 questions_list。接下来,它遍历 DataFrame df 的前三行(df[:3]),从每一行中提取“选项”列的内容,并将这些内容作为参数传递给 chinese_multiple_choice_questions 函数。函数返回的结果随后被追加到 questions_list 列表中。

import re

def chinese_multiple_choice_answers(questions_with_answers):

# 清除输入字符串中的空格和换行符

questions_with_answers = questions_with_answers.replace(" ", "").replace("\n", "")

# 使用正则表达式匹配选择题的答案

choice_pattern = re.compile(r'(\d+)\.([A-Z]+)')

# 使用正则表达式匹配简答题的答案(这里假设简答题的答案不是以大写字母开头)

short_pattern = re.compile(r'(\d+)\.([^A-Z]+)')

# 找到所有匹配的选择题答案

choice_matches = choice_pattern.findall(questions_with_answers)

# 找到所有匹配的简答题答案

short_matches = short_pattern.findall(questions_with_answers)

# 将匹配结果转换为字典,键为题目序号,值为答案

choice_answers = {int(index): answer for index, answer in choice_matches}

short_answers = {int(index): answer for index, answer in short_matches}

# 按序号重新排序答案字典

sorted_choice_answers = sorted(choice_answers.items())

sorted_short_answers = sorted(short_answers.items())

# 初始化答案列表

answers = []

# 遍历排序后的选择题答案,并格式化添加到答案列表中

for id in range(len(sorted_choice_answers)):

answers.append(f"{id+1}. {sorted_choice_answers[id][1]}")

 注意:当前实现没有处理简答题答案,如果需要,可以在这里添加类似的处理逻辑例如:

for id in range(len(sorted_short_answers)):

    answers.append(f"{id+1}. {sorted_short_answers[id][1]}")

    

    # 返回格式化的答案列表

    return answers

# 示例用法

questions_with_answers = "1. A\n2. B\n3. 简述..."

print(chinese_multiple_choice_answers(questions_with_answers))

df['答案_processed'] = df['答案'].map(chinese_multiple_choice_answers)

def get_prompt_cn(text):

prompt = f'''

你是⼀个⾼考选择题出题专家,你出的题有⼀定深度,你将根据阅读文本,出4道单项选择题,包含题目选项,以及对应的答案,注意:不⽤给出原文,每道题由1个问题和4个选项组成,仅存在1个正确答案,请严格按照要求执行。 阅读文本主要是中文,你出的题目需要满足以下要点,紧扣文章内容且题干和答案为中文:

### 回答要求

(1)理解文中重要概念的含义

(2)理解文中重要句子的含意

(3)分析论点、论据和论证方法

### 阅读文本

{text}

'''

return prompt

 

def process_cn(df):

# 初始化两个空列表,用于存储处理后的阅读文本和多项选择题及其答案

res_input = []

res_output = []

# 遍历 DataFrame 中的每一行

for id in range(len(df)):

# 提取当前行的 '选项'、'答案' 和 '阅读文本' 列的值

data_options = df.loc[id, '选项']

data_answers = df.loc[id, '答案']

data_prompt = df.loc[id, '阅读文本']

# 使用自定义函数处理 '选项' 列的值,方便清洗数据

data_options = chinese_multiple_choice_questions(data_options)

# 使用自定义函数处理 '答案' 列的值,方便清洗数据

data_answers = chinese_multiple_choice_answers(data_answers)

# 使用自定义函数处理 '阅读文本' 列的值,方便清洗数据

data_prompt = get_prompt_cn(data_prompt)

# 检查处理后的答案列表的长度是否与处理后的选项列表的长度相等

if len(data_answers) == len(data_options):

# 初始化一个空字符串,用于存储当前行的问题和答案

res = ''

# 遍历处理后的选项列表

for id_, question in enumerate(data_options):

# 将问题和选项添加到结果字符串中

res += f"{question['question']}?\n"

for choice in question['choices']:

res += choice[0] + choice[1] + '\n'

# 将答案添加到结果字符串中

res = res + '答案:' + str(data_answers[id_].split('.')[-1]) + '\n'

# 将生成的问题和答案字符串添加到输出列表中

res_output.append(res)

# 将对应的阅读文本添加到输入列表中

res_input.append(data_prompt)

# 返回处理后的阅读文本列表和多项选择题及其答案列表

return res_input, res_output

这段代码定义了一个名为 process_cn 的函数,它接受一个名为 df 的 DataFrame 作为输入。DataFrame 应该包含至少三列:'选项'、'答案' 和 '阅读文本'。函数的目的是处理这些数据,生成一个中文的多项选择题列表及其对应的答案,并返回两个列表:res_input(包含阅读文本)和 res_output(包含问题和答案)。

以下是函数的详细步骤:

初始化两个空列表 res_input 和 res_output,用于存储处理后的阅读文本和多项选择题及其答案。

遍历 DataFrame df 中的每一行。

对于每一行,提取 '选项'、'答案' 和 '阅读文本' 列的值。

使用 chinese_multiple_choice_questions 函数处理 '选项' 列的值。使用用 chinese_multiple_choice_answers 函数处理 '答案' 列的值。使用 get_prompt_cn 函数处理 '阅读文本' 列的值。

检查处理后的答案列表的长度是否与处理后的选项列表的长度相等。如果相等,继续下一步;否则,跳过当前行。

对于每个问题和其对应的选项,生成一个字符串,包含问题和所有选项,以及答案。问题和选项之间用换行符分隔。

将生成的字符串添加到 res_output 列表中,并将对应的阅读文本添加到 res_input 列表中。

函数最后返回 res_input 和 res_output 两个列表

1.2 英语问答制作

# coding~

import pandas as pd

# 读取Excel文件

df = pd.read_excel('训练集-英语.xlsx')

df = df.replace('.', '.', regex=True).replace('А.', 'A.', regex=True).replace('В.', 'B.', regex=True).replace('С.', 'C.', regex=True).replace('D.', 'D.', regex=True)

# df = df.replace('(', '(', regex=True)

# 读取第二行(即第三行)“选项”列的内容

second_row_option_content = df.loc[0, '选项']

# 显示第二行“选项”列的内容

print(second_row_option_content)

与中文问答一样

import re

# 示例文本

text = """

32. B. The underlying logic of the effect. 33.D. estimates were not fully independent.

34.C. The discussion process. 35.D. Approving.

"""

def remove_whitespace_and_newlines(input_string):

# 使用 str.replace() 方法删除空格、换行符和句号

result = input_string.replace(" ", "").replace("\n", "").replace(".", "")

return result

def get_answers(text):

text = remove_whitespace_and_newlines(text)

# 正则表达式模式,匹配数字后跟一个空格和字母(A-D)

pattern = re.compile(r'(\d+)\s*([A-D])')

# 查找所有匹配项

matches = pattern.findall(text)

res = []

# 提取并存储答案选项

for match in matches:

number, answer = match

res.append(answer)

return res

# 调用函数并打印结果

answers = get_answers(text)

print(answers)

定义函数 remove_whitespace_and_newlines

这个函数接收一个字符串 input_string 作为参数。使用 str.replace() 方法删除字符串中的空格、换行符和句号。返回处理后的字符串。定义函数 get_answers

这个函数接收一个字符串 text 作为参数,代表要处理的文本。调用 remove_whitespace_and_newlines 函数来清理文本。使用正则表达式 re.compile(r'(\d+)\s*([A-D])') 来匹配数字后跟一个空格和字母(A-D)的模式。使用 findall 方法查找所有匹配项,并将它们存储在 matches 列表中。遍历 matches 列表,提取答案选项,并将它们添加到 res 列表中。返回 res 列表,其中包含所有提取的答案选项。调用函数并打印结果

调用 get_answers 函数,并将示例文本 text 作为参数传递给它。将返回的答案选项列表存储在变量 answers 中。打印 answers 列表。

import re

# 示例文本,包含了两个问题和对应的四个选项

text = """

32. What is the capital of France?

A. Paris B. London C. Berlin D. Rome

33. What is the largest planet in our solar system?

A. Jupiter B. Saturn C. Uranus D. Neptune

"""

def get_questions(text):

# 替换文本中的换行符为两个空格,确保正则表达式能正确匹配跨行的内容

# 并在文本末尾添加两个空格,以防最后一个问题后面没有换行符导致匹配失败

text = text.replace('\n', ' ') + ' '

# 编译正则表达式模式,用于匹配问题和其对应的四个选项

pattern = re.compile(r'(\d+\.\s.*?)\s+(A\.\s.*?)\s+(B\.\s.*?)\s+(C\.\s.*?)\s+(D\.\s.*?)(?=\n\d+\.\s|$)', re.DOTALL)

# 使用正则表达式查找所有匹配的问题和选项

matches = pattern.findall(text)

# 初始化一个空列表,用于存储提取出的问题和选项的字典

questions_dict_list = []

# 遍历所有匹配项

for match in matches:

# 解构匹配项,分别获取问题和四个选项的内容

question, option_a, option_b, option_c, option_d = match

# 去除问题文本前后的空白字符

question_text = question.strip()

# 提取选项的字母和内容,并去除前后的空白字符

options = {

'A': option_a.strip(),

'B': option_b.strip(),

'C': option_c.strip(),

'D': option_d.strip()

}

# 创建一个字典,包含问题和其对应的选项

question_dict = {

'question': question_text,

'options': options

}

# 将包含问题和选项的字典添加到列表中

questions_dict_list.append(question_dict)

# 返回包含所有问题和选项的字典列表

return questions_dict_list

# 调用函数,并传入示例文本,获取提取出的问题和选项

questions = get_questions(text)

# 遍历并打印提取出的问题和选项

for q in questions:

print(q)

这段代码的主要功能是从一段包含问题和选项的文本中提取出每个问题和其对应的四个选项,并将它们以字典的形式存储在一个列表中。每个字典都包含一个“question”键,其值是对应的问题文本,以及一个“options”键,其值是一个包含四个选项的字典

def get_prompt_en(text):

prompt = f'''

你是⼀个⾼考选择题出题专家,你出的题有⼀定深度,你将根据阅读文本,出4道单项选择题,包含题目选项,以及对应的答案,注意:不⽤给出原文,每道题由1个问题和4个选项组成,仅存在1个正确答案,请严格按照要求执行。

The reading text is mainly in English. The questions and answers you raised need to be completed in English for at least the following points:

### 回答要求

(1)Understanding the main idea of the main idea.

(2)Understand the specific information in the text.

(3)infering the meaning of words and phrases from the context

### 阅读文本

{text}

'''

return prompt

这段代码定义了一个名为 get_prompt_en 的函数,它接收一个参数 text,并返回一个格式化的字符串 prompt。这个字符串是一个指令或提示,用于指导出题专家如何根据提供的英文阅读文本 text 来出题。这个函数可以用于生成一个标准化的出题指令,帮助出题专家按照特定的要求出题。这个提示包含了以下几个部分:

角色定位:指出出题专家是一个高考选择题出题专家,出的题有一定深度。出题要求:根据阅读文本出4道单项选择题,每道题由1个问题和4个选项组成,仅存在1个正确答案。语言要求:阅读文本主要是英文,提出的问题和答案也需要用英文完成。答题要求

理解文本的主旨大意。理解文本中的具体信息。根据上下文推断词汇和短语的含义。阅读文本:在提示的最后,通过 {text} 占位符插入了实际的阅读文本。

def process_en(df):

res_input = []

res_output = []

for id in range(len(df)):

data_options = df.loc[id, '选项']

data_answers = df.loc[id,'答案']

data_prompt = df.loc[id,'阅读文本']

data_options = get_questions(data_options)

data_answers = get_answers(data_answers)

data_prompt = get_prompt_en(data_prompt)

# print(data_options)

# print(data_answers)

if(len(data_answers)==len(data_options)):

res = ''

for id,question in enumerate(data_options):

res += f'''

{id+1}.{question['question']}

{question['options']['A']}

{question['options']['B']}

{question['options']['C']}

{question['options']['D']}

answer:{data_answers[id]}

'''+'\n'

res_output.append(res)

res_input.append(data_prompt)

return res_input,res_output

# break

这段代码定义了一个名为 process_en 的函数,它接收一个参数 df。函数的目的是处理这个数据框,从中提取阅读文本、选项和答案,然后按照特定格式生成输入和输出。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。