pic_pos_judge.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #!/usr/bin/env/python
  2. # -*- coding:utf-8 -*-
  3. import re
  4. def img_regroup(item_list, row_list):
  5. """
  6. 判断图片是否存在错位,否则重新划分所属
  7. 排除 某个题的题文都是图片的情况!!!
  8. :param item_list: 第一次进行题目切分的结果
  9. :param row_list: all行文本
  10. :return:
  11. """
  12. # ------------题目开头图片分错判断---统计信息-----------------
  13. no_pic_id = [] # 没有图但有信息的题目id
  14. item_pic_end = [] # 收集题目末尾的图片
  15. have_pic_info = [0] * len(item_list) # 是否有图片
  16. item_pic_type1_id = [] # ‘susp_pic’
  17. temp_res = []
  18. bef_con = item_list[0]["stem"] # bef_con:前一个题的题文
  19. for k, sub_res in enumerate(item_list):
  20. sub_res = sub_res.copy()
  21. raw_cont = sub_res["stem"]
  22. # end_pic = []
  23. # if re.match(r"\n*\s*(<imgsrc.*?/>[\s\n]*)*?$", sub_res["stem"]) is None:
  24. # end_pic = re.findall(r"\n(<imgsrc\d+ w_h=[^A-Z$]*?/>\s*(<imgsrc\d+ w_h=[^A-Z$]*?/>)*?)\n?$",
  25. # sub_res["stem"], flags=re.S)
  26. # 末尾图片不应该把公式统计在内吧
  27. end_pic = re.findall(r"\n(<imgsrc\d+ w_h=[\d.]+\*[\d.]+(\sdata-latex=.*?\")?\s*/>\s*"
  28. r"(<imgsrc\d+ w_h=[\d.]+\*[\d.]+(\sdata-latex=.*?\")?\s*/>)*?)\n?$", sub_res["stem"])
  29. if end_pic:
  30. item_pic_end.append(re.findall("<imgsrc.+?/>", end_pic[0][0]))
  31. temp_res.append(sub_res)
  32. temp_res[-1]["stem"] = re.split("\n<imgsrc.+?/>\s*(<imgsrc((?!/>).)+?/>)*?\n?$", sub_res["stem"])[0]
  33. # 判断下该图片后面是否存在很多空行,不存在则加标识
  34. pic_temp_id = [k1 for k1, r in enumerate(row_list) if item_pic_end[-1][0] in r]
  35. is_konghang = []
  36. for r in row_list[pic_temp_id[0] + 1:]:
  37. if not re.sub(r"[\s\n\t]", "", r):
  38. is_konghang.append(1)
  39. else:
  40. break
  41. if len(is_konghang)<2:
  42. item_pic_end[-1].append("#@#")
  43. else:
  44. item_pic_end.append("")
  45. temp_res.append(sub_res)
  46. if 'susp_pic' in sub_res:
  47. item_pic_type1_id.append(k)
  48. # 统计---本题没有图片,前一题有图片,且本题提示了图片信息---这样的题目id
  49. if re.search("如[上下左右]?图|下[面列]图中", raw_cont):
  50. have_pic_info[k] = 1
  51. if "imgsrc" not in raw_cont:
  52. if k > 0 and "imgsrc" in bef_con and 'susp_pic' not in sub_res: # 从第2题开始
  53. no_pic_id.append(k)
  54. bef_con = raw_cont # item_list[k-1]["stem"]和raw_cont对不上,不知道为啥
  55. print("no_pic_id索引:", no_pic_id)
  56. print("item_pic_type1_id:", item_pic_type1_id)
  57. print("have_pic_info:", have_pic_info)
  58. print("item_pic_end:",item_pic_end,len(item_pic_end))
  59. # pprint(temp_res)
  60. # 开始图片位置纠错--------------------------------------------------
  61. right_after_corret = True
  62. if no_pic_id: # 图片可能是公式图片或公式截图
  63. for nn, i in enumerate(no_pic_id):
  64. st = 0 if nn == 0 else no_pic_id[nn - 1] + 1
  65. if item_pic_end[i - 1] and "#@#" in item_pic_end[i - 1]:
  66. temp_res[i]["stem"] += "\n" + item_pic_end[i - 1][-2] # 默认取一个
  67. if item_pic_end[i - 1][:-2]:
  68. temp_res[i-1]["stem"] += "\n" + "\n".join(item_pic_end[i - 1][:-2])
  69. item_pic_end[i - 1] = "" # 取完后图片要清空
  70. else:
  71. temp_res[i]['errmsgs'].append("本题缺图片")
  72. right_after_corret = False
  73. bef_id_list = list(range(st, i))
  74. bef_id_list.reverse()
  75. for j in bef_id_list: # 从当前位置向前继续判断
  76. # print(j,'--------------',item_pic_end[j - 1])
  77. if have_pic_info[j]: # 有图片信息,
  78. if "imgsrc" not in temp_res[j]["stem"]: # 没图片
  79. if 'susp_pic' in temp_res[j]:
  80. temp_res[j]["stem"] += "\n" + "\n".join(temp_res[j]['susp_pic'])
  81. del temp_res[j]['susp_pic']
  82. elif not item_pic_end[j]: # 本身末尾没图片时
  83. if j > 0 and item_pic_end[j - 1] and "#@#" in item_pic_end[j - 1]:
  84. temp_res[j]["stem"] += "\n" + item_pic_end[j - 1][-2]
  85. if len(item_pic_end[j - 1][:-1]) > 1:
  86. temp_res[j - 1]["stem"] += "\n" + "\n".join(item_pic_end[j - 1][:-2])
  87. item_pic_end[j - 1] = ""
  88. else:
  89. temp_res[j]['errmsgs'].append("本题缺图片")
  90. print("第{}题缺图片".format(str(temp_res[j]['item_id']))) # 本身有吗?
  91. right_after_corret = False
  92. else:
  93. temp_res[j]["stem"] += "\n" + "\n".join(item_pic_end[j]).replace("#@#", "")
  94. item_pic_end[j] = ""
  95. elif item_pic_end[j-1] and "#@#" in item_pic_end[j-1]: # 有图片,(但不一定就是如图的“图”),且前一题末尾有图
  96. print("第{}题可能漏图片".format(str(temp_res[j]['item_id'])))
  97. if not have_pic_info[j - 1] or (j > 1 and item_pic_end[j - 2] and "#@#" in item_pic_end[j-2]): # 前面一题没有图片信息或前前一题末尾有图片时
  98. if not item_pic_end[j]: # 本题末尾没有图片
  99. temp_res[j]["stem"] += "\n" + item_pic_end[j - 1][-2]
  100. if len(item_pic_end[j - 1][:-1]) > 1:
  101. temp_res[j - 1]["stem"] += "\n" + "\n".join(item_pic_end[j - 1][:-2])
  102. item_pic_end[j - 1] = ""
  103. else: # 本身有图片的话,用自己的
  104. temp_res[j]["stem"] += "\n" + "\n".join(item_pic_end[j]).replace("#@#", "")
  105. item_pic_end[j] = ""
  106. else:
  107. temp_res[j - 1]["stem"] += "\n" + "\n".join(item_pic_end[j - 1]).replace("#@#", "")
  108. item_pic_end[j - 1] = ""
  109. elif item_pic_end[j]: # 当前题末尾有图
  110. temp_res[j]["stem"] += "\n" + "\n".join(item_pic_end[j]).replace("#@#", "")
  111. item_pic_end[j] = ""
  112. else: # 其他图片信息关键字没匹配到,可能 会漏掉
  113. if item_pic_end[j]:
  114. temp_res[j]["stem"] += "\n" + "\n".join(item_pic_end[j]).replace("#@#", "")
  115. item_pic_end[j] = ""
  116. if right_after_corret:
  117. item_list = temp_res
  118. if any([True if m else False for m in item_pic_end]):
  119. for mi, m in enumerate(item_pic_end):
  120. if m:
  121. item_list[mi]["stem"] += "\n" + "\n".join(item_pic_end[mi]).replace("#@#", "")
  122. # else:
  123. if item_pic_type1_id:
  124. for i in item_pic_type1_id:
  125. if 'susp_pic' in temp_res[i]:
  126. temp_res[i]["stem"] += "\n" + "\n".join(temp_res[i]['susp_pic'])
  127. return item_list