Merge commit '6e7ad7e32522a88f1d71a15307ca856fe3c3f495'
This commit is contained in:
commit
67938a3ad6
|
|
@ -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,6 +445,52 @@ def GenerateProblemListFromString(data): #从来自.tex文件的字符串生成
|
||||||
return problem_list #返回一个列表, 每一项是一个由 题目内容 和 题目来源前缀 组成的元组
|
return problem_list #返回一个列表, 每一项是一个由 题目内容 和 题目来源前缀 组成的元组
|
||||||
|
|
||||||
|
|
||||||
|
def GenerateNewProblemDataFromString2024(data): #从data字符串生成题目列表, 每个item是一道题目, 题目后有色块的准关联题目的flushright块中的信息表示交互信息(如(003214rep)表示不添加, 用003214代替; (002521s)表示和002521相同, (000354r)表示和000354相关, 返回三元组(题目内容, 中缀, 交互信息列表)的字典
|
||||||
|
try:
|
||||||
|
data = re.findall(r"\\begin\{document\}([\s\S]*?)\\end\{document\}",data)[0]
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
data = data + "\n\\end{enumerate}"
|
||||||
|
data = re.sub(r"\n{2,}","\n",data)
|
||||||
|
data = re.sub(r"\\item",r"\\enditem\\item",data)
|
||||||
|
data = re.sub(r"\\end\{enumerate\}",r"\\enditem",data) #切除无关信息, 保留关键信息
|
||||||
|
problempositions = []
|
||||||
|
for item in re.finditer(r"\\item([\s\S]*?)\\enditem",data):
|
||||||
|
problempositions.append(item.regs[1]) #确定题目内容所在位置
|
||||||
|
problem_list = []
|
||||||
|
for pos in problempositions:
|
||||||
|
content_raw = data[pos[0]:pos[1]].strip()
|
||||||
|
meta = {"same":[],"related":[],"unrelated":[]}
|
||||||
|
sim_problems = re.findall(r"\\definecolor[\s\S]*?\\end\{tcolorbox\}",content_raw)
|
||||||
|
for sim_p in sim_problems:
|
||||||
|
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 = content_raw.strip()
|
||||||
|
if "rep" in meta:
|
||||||
|
repid = meta["rep"]
|
||||||
|
meta = {"rep": id}
|
||||||
|
subdata = data[:pos[0]] #开始寻找出处中缀
|
||||||
|
suflist = re.findall(r"\n(\%\s{0,}[\S]+)\n",subdata)
|
||||||
|
if len(suflist) == 0:
|
||||||
|
suffix = ""
|
||||||
|
else:
|
||||||
|
suffix = suflist[-1].replace("%","").strip()
|
||||||
|
problem_list.append((content,suffix,meta))
|
||||||
|
# print(content,suffix,meta)
|
||||||
|
return problem_list #返回一个列表, 每一项是一个由 题目内容 和 题目来源前缀 和 交互信息字典 组成的元组
|
||||||
|
|
||||||
|
|
||||||
def GenerateProblemListFromString2024(data): #从来自.tex文件的字符串生成题目列表, 每个item是一道题目, 新一行的%用作前缀, item后面的方括号放与题库的交互信息(如[rep3214]表示不添加, 用003214代替; [s2521;r354;u10021,20024]表示和2521相同, 和354相关, 和10021,20024无关), 返回三元组(题目内容, 题目来源前缀, 交互信息列表)的字典
|
def GenerateProblemListFromString2024(data): #从来自.tex文件的字符串生成题目列表, 每个item是一道题目, 新一行的%用作前缀, item后面的方括号放与题库的交互信息(如[rep3214]表示不添加, 用003214代替; [s2521;r354;u10021,20024]表示和2521相同, 和354相关, 和10021,20024无关), 返回三元组(题目内容, 题目来源前缀, 交互信息列表)的字典
|
||||||
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]
|
||||||
|
|
|
||||||
|
|
@ -51,33 +51,24 @@ class MyWindow_bdsl(QWidget,Ui_Form):
|
||||||
problems_raw = re.findall(r"\\begin\{enumerate\}([\s\S]*?)\\end\{enumerate\}",data_raw)
|
problems_raw = re.findall(r"\\begin\{enumerate\}([\s\S]*?)\\end\{enumerate\}",data_raw)
|
||||||
data = "\n".join([item.strip() for item in problems_raw])
|
data = "\n".join([item.strip() for item in problems_raw])
|
||||||
problems = [(d.strip()) for d in data.split("\\item") if not d.strip() == ""]
|
problems = [(d.strip()) for d in data.split("\\item") if not d.strip() == ""]
|
||||||
output = "使用说明:\\\\\n rep??????表示使用已有题号??????,\\\\\n s??????表示和??????相同,\\\\\n r??????表示和??????相关\n\n\\begin{enumerate}\n\n"
|
output = "使用说明:\\\\\n ??????(rep)表示使用已有题号??????,\\\\\n ??????(s)表示和??????相同,\\\\\n ??????(r)表示和??????相关\n\n\\begin{enumerate}\n\n"
|
||||||
|
|
||||||
|
|
||||||
for p in problems:
|
for p in problems:
|
||||||
p_treated = pre_treating(p)
|
p_treated = pre_treating(p)
|
||||||
t = stringmaxsim(p_treated,treated_dict,5)
|
t = stringmaxsim(p_treated,treated_dict,5)
|
||||||
psrstring = ""
|
output += f"\\item {p}\n\n"
|
||||||
for id,simrate in t:
|
|
||||||
if simrate == 1:
|
|
||||||
psrstring = "rep"+id+","
|
|
||||||
elif simrate > 0.5:
|
|
||||||
psrstring += id + ","
|
|
||||||
if len(psrstring) > 0 and psrstring[-1] == ",":
|
|
||||||
psrstring = psrstring[:-1]
|
|
||||||
if len(psrstring) > 0:
|
|
||||||
output += f"\\item [{psrstring}] {p}\n\n"
|
|
||||||
else:
|
|
||||||
output += f"\\item {p}\n\n"
|
|
||||||
count = 0
|
count = 0
|
||||||
for id,simrate in t:
|
for id,simrate in t:
|
||||||
if simrate > 0.5:
|
if simrate > 0.5:
|
||||||
colors = get_color(simrate*2-1)
|
colors = get_color(simrate*2-1)
|
||||||
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"
|
output += "\n\\begin{tcolorbox}"+f"[colback = mycolor, opacityback = 0.25, colframe = orange!10!white, breakable]\n\n"
|
||||||
output += f"{simrate:.3f} \\ {id}\n\n"
|
output += "\\begin{flushright}\\begin{Large}\n"
|
||||||
|
output += f"相似度: {simrate:.3f} \\ {id}({'rep' if simrate == 1 else ''})\n"
|
||||||
|
output += "\\end{Large}\\end{flushright}"
|
||||||
content = pro_dict[id]
|
content = pro_dict[id]
|
||||||
output += f"{content}\n"
|
output += f"\n{content}\n"
|
||||||
output += "\\end{tcolorbox}\n"
|
output += "\\end{tcolorbox}\n"
|
||||||
count += 1
|
count += 1
|
||||||
output += "\n\n"
|
output += "\n\n"
|
||||||
|
|
@ -98,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:
|
||||||
|
|
@ -130,6 +122,8 @@ class MyWindow_bdsl(QWidget,Ui_Form):
|
||||||
self.db.commit()
|
self.db.commit()
|
||||||
self.db.close()
|
self.db.close()
|
||||||
print("已提交至数据库")
|
print("已提交至数据库")
|
||||||
|
self.pushButton_commit.setDisabled(True)
|
||||||
|
self.problemstoimport = []
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue