批量收录题目功能更新完成

This commit is contained in:
wangweiye7840 2024-06-07 10:39:28 +08:00
parent d288a7bf48
commit 769428ac6d
2 changed files with 34 additions and 35 deletions

View File

@ -393,6 +393,18 @@ def NextSpareID(num,database): #返回adict中下一个空闲的题号
mydb.close() mydb.close()
return num return num
def NextSpareIDseries(num,cursor,length): #返回adict中以num起始, 连续长度至少为length的下一个空闲的题号
cursor.execute("SELECT ID FROM problems;")
idlist = [ret[0] for ret in cursor.fetchall()]
idset = set(idlist)
num = int(num)
numset = set([str(num+i).zfill(6) for i in range(length)])
while len(idset & numset) >= 1:
numset.remove(str(num).zfill(6))
numset.add(str(num+length).zfill(6))
num += 1
return num
def NextSpareIDBlock(num,database): #返回adict中下一个空闲的题号块 def NextSpareIDBlock(num,database): #返回adict中下一个空闲的题号块
mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = database) mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = database)
mycursor = mydb.cursor() mycursor = mydb.cursor()
@ -433,15 +445,13 @@ def GenerateProblemListFromString(data): #从来自.tex文件的字符串生成
return problem_list #返回一个列表, 每一项是一个由 题目内容 和 题目来源前缀 组成的元组 return problem_list #返回一个列表, 每一项是一个由 题目内容 和 题目来源前缀 组成的元组
def GenerateProblemListFromString202406(data): #从data字符串生成题目列表, 每个item是一道题目, 题目后有色块的准关联题目的flushright块中的信息表示交互信息(如(003214rep)表示不添加, 用003214代替; (002521s)表示和002521相同, (000354r)表示和000354相关, 返回二元组(题目内容, 交互信息列表)的字典 def GenerateNewProblemDataFromString2024(data): #从data字符串生成题目列表, 每个item是一道题目, 题目后有色块的准关联题目的flushright块中的信息表示交互信息(如(003214rep)表示不添加, 用003214代替; (002521s)表示和002521相同, (000354r)表示和000354相关, 返回三元组(题目内容, 中缀, 交互信息列表)的字典
try: try:
data = re.findall(r"\\begin\{document\}([\s\S]*?)\\end\{document\}",data)[0] data = re.findall(r"\\begin\{document\}([\s\S]*?)\\end\{document\}",data)[0]
except: except:
pass pass
data = data + "\n\\end{enumerate}" data = data + "\n\\end{enumerate}"
data = re.sub(r"\n{2,}","\n",data) data = re.sub(r"\n{2,}","\n",data)
# data = re.sub(r"\\definecolor[^\n]*\n","\n",data)
# data = re.sub(r"\\begin\{tcolorbox\}[\s\S]*?\\end\{tcolorbox\}","\n",data)
data = re.sub(r"\\item",r"\\enditem\\item",data) data = re.sub(r"\\item",r"\\enditem\\item",data)
data = re.sub(r"\\end\{enumerate\}",r"\\enditem",data) #切除无关信息, 保留关键信息 data = re.sub(r"\\end\{enumerate\}",r"\\enditem",data) #切除无关信息, 保留关键信息
problempositions = [] problempositions = []
@ -450,39 +460,26 @@ def GenerateProblemListFromString202406(data): #从data字符串生成题目列
problem_list = [] problem_list = []
for pos in problempositions: for pos in problempositions:
content_raw = data[pos[0]:pos[1]].strip() content_raw = data[pos[0]:pos[1]].strip()
meta = {"same":[],"related":[],"unrelated":[]}
sim_problems = re.findall(r"\\definecolor[\s\S]*?\\end\{tcolorbox\}",content_raw) sim_problems = re.findall(r"\\definecolor[\s\S]*?\\end\{tcolorbox\}",content_raw)
for sim_p in sim_problems: for sim_p in sim_problems:
#处理meta待修改 metainfo = re.findall(r"相似度:[\s]*\d\.\d{3}[\\\s]*?(\d{6})\(([\s\S]*?)\)",sim_p)
if len(metainfo) == 1:
id,metatype = metainfo[0]
metatype = metatype.upper()
if metatype.startswith("REP"):
meta["rep"] = id.zfill(6)
elif metatype.startswith("S"):
meta["same"].append(id.zfill(6))
elif metatype.startswith("R"):
meta["related"].append(id.zfill(6))
elif metatype.startswith("U"):
meta["unrelated"].append(id.zfill(6))
content_raw = content_raw.replace(sim_p,"") content_raw = content_raw.replace(sim_p,"")
content = content_raw.strip() content = content_raw.strip()
#以下待修改----20240607 if "rep" in meta:
repid = meta["rep"]
content_raw = re.sub(r"\n\%[\s\S]*$","",content_raw) #题目内容 meta = {"rep": id}
content_raw = re.sub(r"\\\\$","",content_raw) # 删去题目最后一行处可能存在的\\
content_raw = content_raw.strip() # 删去前后多余的空格
meta = {}
if not content_raw[0] == "[": # 根据方括号内的内容生成交互信息, 这是无方括号的内容, 无meta
content = content_raw
else:
same_id_list = []
related_id_list = []
unrelated_id_list = []
content = re.sub(r"^\[[A-Za-z\d,\s]*?\]","",content_raw).strip()
metaraw = re.findall(r"\[.*?\]",content_raw)[0]
metaraw = re.sub(r"[\[\]]","",metaraw)
metalist = metaraw.split(",")
for metaitem in metalist:
metaitem = metaitem.upper()
if metaitem.startswith("REP"):
meta = {"rep":metaitem[3:].zfill(6)}
elif metaitem.startswith("S"):
same_id_list.append(metaitem[1:].zfill(6))
elif metaitem.startswith("R"):
related_id_list.append(metaitem[1:].zfill(6))
elif metaitem.startswith("U"):
unrelated_id_list.append(metaitem[1:].zfill(6))
if not "rep" in meta:
meta = {"same":same_id_list,"related":related_id_list,"unrelated":unrelated_id_list}
subdata = data[:pos[0]] #开始寻找出处中缀 subdata = data[:pos[0]] #开始寻找出处中缀
suflist = re.findall(r"\n(\%\s{0,}[\S]+)\n",subdata) suflist = re.findall(r"\n(\%\s{0,}[\S]+)\n",subdata)
if len(suflist) == 0: if len(suflist) == 0:
@ -490,6 +487,7 @@ def GenerateProblemListFromString202406(data): #从data字符串生成题目列
else: else:
suffix = suflist[-1].replace("%","").strip() suffix = suflist[-1].replace("%","").strip()
problem_list.append((content,suffix,meta)) problem_list.append((content,suffix,meta))
# print(content,suffix,meta)
return problem_list #返回一个列表, 每一项是一个由 题目内容 和 题目来源前缀 和 交互信息字典 组成的元组 return problem_list #返回一个列表, 每一项是一个由 题目内容 和 题目来源前缀 和 交互信息字典 组成的元组

View File

@ -65,7 +65,7 @@ class MyWindow_bdsl(QWidget,Ui_Form):
output += "\n\\definecolor{mycolor}{rgb}"+colors output += "\n\\definecolor{mycolor}{rgb}"+colors
output += "\n\\begin{tcolorbox}"+f"[colback = mycolor, opacityback = 0.25, colframe = orange!10!white, breakable]\n\n" output += "\n\\begin{tcolorbox}"+f"[colback = mycolor, opacityback = 0.25, colframe = orange!10!white, breakable]\n\n"
output += "\\begin{flushright}\\begin{Large}\n" output += "\\begin{flushright}\\begin{Large}\n"
output += f"相似度: {simrate:.3f} \\ {id}()\n" output += f"相似度: {simrate:.3f} \\ {id}({'rep' if simrate == 1 else ''})\n"
output += "\\end{Large}\\end{flushright}" output += "\\end{Large}\\end{flushright}"
content = pro_dict[id] content = pro_dict[id]
output += f"\n{content}\n" output += f"\n{content}\n"
@ -89,11 +89,12 @@ class MyWindow_bdsl(QWidget,Ui_Form):
else: else:
Indexed = False Indexed = False
idlistpath = "文本文件/新题收录列表.txt" idlistpath = "文本文件/新题收录列表.txt"
problems = GenerateProblemListFromString2024(data) #待修改(检测题目方式有变) problems = GenerateNewProblemDataFromString2024(data)
problem_count = len(problems)
# pro_dict = load_dict("../题库0.3/Problems.json") # pro_dict = load_dict("../题库0.3/Problems.json")
nextspareid = NextSpareID(starting_id,self.database_name) #待修改(检测空白块数大小)
self.db = connect(hostname = db_host, port= db_port, username= db_user, pwd = db_pwd, db= self.database_name) self.db = connect(hostname = db_host, port= db_port, username= db_user, pwd = db_pwd, db= self.database_name)
self.cursor = self.db.cursor() self.cursor = self.db.cursor()
nextspareid = NextSpareIDseries(starting_id,self.db.cursor(),problem_count) #待修改(检测空白块数大小)
rolled_back = False rolled_back = False
idlist,newproblemlist = AddProblemstoDict2024nocommit(nextspareid,raworigin,problems,editor,Indexed,self.cursor) idlist,newproblemlist = AddProblemstoDict2024nocommit(nextspareid,raworigin,problems,editor,Indexed,self.cursor)
for p in newproblemlist: for p in newproblemlist: