tasks.py 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. import time
  2. from fallback import fallback
  3. from dianceng import dianceng
  4. from lingji import lingji
  5. from jieheceng import jieheceng
  6. from celery_app import celery_app
  7. from postprocess import postprocess
  8. from extra import extra, need_extra
  9. from huansuan import callzaihuansuan
  10. import json
  11. import dedata
  12. import chromadb
  13. client = chromadb.HttpClient(host='47.101.198.30',port=8000)
  14. collection = client.get_or_create_collection(name="tj_de_bge")
  15. cuoshi_collection = client.get_or_create_collection(name="tj_cuoshi_bge")
  16. menchuang_collection = client.get_or_create_collection(name="tj_menchuang_bge")
  17. from FlagEmbedding import FlagModel
  18. model = FlagModel('/mnt/d/Develop/bge/test2_encoder_only_base_bge-large-zh-v1.5')
  19. cuoshi_model = FlagModel('cuoshi_encoder_only_base_bge-large-zh-v1.5/cuoshi_encoder_only_base_bge-large-zh-v1.5')
  20. from sentence_transformers import CrossEncoder
  21. ce = CrossEncoder('/mnt/d/Develop/celery/final')
  22. cuoshi_ce = CrossEncoder('cuoshi_reranker/final')
  23. #ce = CrossEncoder('/Users/zxp/Downloads/reranker')
  24. with open("hunningtu_rule", "r") as f:
  25. content = f.read()
  26. obj = json.loads(content)
  27. with open("nantong_rule", "r") as f:
  28. content = f.read()
  29. obj2 = json.loads(content)
  30. with open("basic_rule", "r") as f:
  31. content = f.read()
  32. basic = json.loads(content)
  33. with open("menchuang_rule", "r") as f:
  34. content = f.read()
  35. menchuang = json.loads(content)
  36. with open("incremental_rule", "r") as f:
  37. content = f.read()
  38. incremental = json.loads(content)
  39. with open("label_name", "r") as f:
  40. content = f.read()
  41. label_name = json.loads(content)
  42. with open("name_label", "r") as f:
  43. content = f.read()
  44. name_label = json.loads(content)
  45. with open("name_dw", "r") as f:
  46. content = f.read()
  47. name_dw = json.loads(content)
  48. THRESHOLD=0.8####adjust it
  49. import os
  50. from openai import OpenAI
  51. import requests
  52. aiclient = OpenAI(
  53. #api_key=os.getenv("DASHSCOPE_API_KEY"),
  54. api_key=os.getenv("ZAI_API_KEY"),
  55. #base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
  56. base_url="https://open.bigmodel.cn/api/paas/v4/",
  57. )
  58. qwclient = OpenAI(
  59. # 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx",
  60. #api_key=os.getenv("DASHSCOPE_API_KEY"),
  61. api_key=os.getenv("MS_API_KEY"),
  62. #base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
  63. base_url="https://api-inference.modelscope.cn/v1/",
  64. )
  65. hyclient = OpenAI(
  66. # 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx",
  67. #api_key=os.getenv("DASHSCOPE_API_KEY"),
  68. api_key=os.getenv("HY_API_KEY"),
  69. #base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
  70. base_url="https://api.hunyuan.cloud.tencent.com/v1",
  71. )
  72. bdclient = OpenAI(
  73. # 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx",
  74. #api_key=os.getenv("DASHSCOPE_API_KEY"),
  75. api_key=os.getenv("BD_API_KEY"),
  76. #base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
  77. base_url="https://qianfan.baidubce.com/v2",
  78. )
  79. sfclient = OpenAI(
  80. # 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx",
  81. #api_key=os.getenv("DASHSCOPE_API_KEY"),
  82. api_key=os.getenv("SF_API_KEY"),
  83. #base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
  84. base_url="https://api.siliconflow.cn/v1",
  85. )
  86. def callzaikuailiao(data):
  87. time.sleep(1)
  88. completion = aiclient.chat.completions.create(
  89. # 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
  90. model="glm-4.5-flash",
  91. #model="ZhipuAI/GLM-4.5",
  92. #model="qwen3-4b",
  93. messages=[
  94. {"role": "system", "content": "You are a helpful assistant."},
  95. {"role": "user", "content": " 楼地面有多种做法,包括整体面层,块料面层,木地板等。块料面层常见的有石材块料面板,缸砖,马赛克,假麻石块,地砖,橡胶塑料板等。 现在给定一工作内容如下: " + data['label'] + " " + data['mc'] + " " + data['tz'] + ", 计量单位为" + data['dw'] + ", 请问该工作内容中包括了块料面层施工吗?"},
  96. ],
  97. # Qwen3模型通过enable_thinking参数控制思考过程(开源版默认True,商业版默认False)
  98. # 使用Qwen3开源版模型时,若未启用流式输出,请将下行取消注释,否则会报错
  99. #extra_body={"enable_thinking": False},
  100. extra_body={"thinking": {"type": "disabled"}},
  101. )
  102. json_string = completion.choices[0].message.content
  103. print(json_string)
  104. time.sleep(1)
  105. completion = sfclient.chat.completions.create(
  106. # 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
  107. model="THUDM/GLM-4-9B-0414",
  108. #model="glm-4.5-flash",
  109. messages=[
  110. {"role": "system", "content": "You are a helpful assistant.请将最终答案以JSON格式输出"},
  111. {"role": "user", "content": " 给你一段文字如下, " + json_string + ",其中给出了关于是否包括块料面层施工的判断,请将该判断输出。请输出是或者否"},
  112. ],
  113. # Qwen3模型通过enable_thinking参数控制思考过程(开源版默认True,商业版默认False)
  114. # 使用Qwen3开源版模型时,若未启用流式输出,请将下行取消注释,否则会报错
  115. #extra_body={"enable_thinking": False},
  116. extra_body={"thinking": {"type": "disabled"}},
  117. )
  118. json_string = completion.choices[0].message.content
  119. print(json_string)
  120. return json_string
  121. def callzaiclarify(data):
  122. completion = aiclient.chat.completions.create(
  123. # 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
  124. model="glm-4.5-flash",
  125. #model="qwen3-4b",
  126. messages=[
  127. {"role": "system", "content": "You are a helpful assistant."},
  128. {"role": "user", "content": " 管桩的清单工作内容描述可以分成两类,一类是打桩、压桩,属于桩基工程的一种,其工作内容计量的单位一般是米(m)或根。另一类是填芯,一般是向桩芯内浇混凝土,属于土建工程的一种,其配套的计量单位一般是立方米(m3),即浇混凝土的体积量。现在给定一工作内容如下: " + data['label'] + " " + data['mc'] + " " + data['tz'] + ", 计量单位为" + data['dw'] + ", 请问该工作内容属于填芯吗?"},
  129. ],
  130. # Qwen3模型通过enable_thinking参数控制思考过程(开源版默认True,商业版默认False)
  131. # 使用Qwen3开源版模型时,若未启用流式输出,请将下行取消注释,否则会报错
  132. #extra_body={"enable_thinking": False},
  133. extra_body={"thinking": {"type": "disabled"}},
  134. )
  135. json_string = completion.choices[0].message.content
  136. print(json_string)
  137. completion = sfclient.chat.completions.create(
  138. # 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
  139. model="THUDM/GLM-4-9B-0414",
  140. #model="glm-4.5-flash",
  141. messages=[
  142. {"role": "system", "content": "You are a helpful assistant.请将最终答案以JSON格式输出"},
  143. {"role": "user", "content": " 给你一段文字如下, " + json_string + ",其中给出了关于是不是填芯的判断,请将该判断输出。请输出是或者否"},
  144. ],
  145. # Qwen3模型通过enable_thinking参数控制思考过程(开源版默认True,商业版默认False)
  146. # 使用Qwen3开源版模型时,若未启用流式输出,请将下行取消注释,否则会报错
  147. #extra_body={"enable_thinking": False},
  148. extra_body={"thinking": {"type": "disabled"}},
  149. )
  150. json_string = completion.choices[0].message.content
  151. print(json_string)
  152. return json_string
  153. def callzaidw(A,B):
  154. time.sleep(1)
  155. completion = qwclient.chat.completions.create(
  156. # 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
  157. #model="glm-4.5-flash",
  158. model="ZhipuAI/GLM-4.5",
  159. #model="qwen3-4b",
  160. messages=[
  161. {"role": "system", "content": "You are a helpful assistant."},
  162. {"role": "user", "content": " 计量单位可以用名称或者符号表示,常用的符号包括表示米的符号m,表示千米的符号km,表示吨的符号t,表示千克的符号kg,表示平方米的符号m2,表示立方米的符号m3。也有计量单位很宽泛,比如“项”、“次”. 给定一个工作量计量单位,内容为" + A + ",记作A,再给定一个工作量计量单位,内容为" + B + ",记作B。若两个单位相等,请返回A=B。例如,“项”跟“次”是等价的,应返回A=B。若两个单位不相等,但是存在比例换算关系,请返回比例换算关系,例如A单位是m,B单位是10m, 则返回A=0.1*B。再例如,A单位是10m2,B单位是m2,则返回A=10*B。再例如,A单位是m3, B单位是1000m3,则返回A=0.001*B。若两个单位不相等,且不存在比例换算关系,请返回A<>B,例如A单位是m,B单位是m2,一个表示长度,一个表示面积,不存在比例关系,则返回A<>B。 "},
  163. ],
  164. # Qwen3模型通过enable_thinking参数控制思考过程(开源版默认True,商业版默认False)
  165. # 使用Qwen3开源版模型时,若未启用流式输出,请将下行取消注释,否则会报错
  166. #extra_body={"enable_thinking": False},
  167. extra_body={"thinking": {"type": "disabled"}},
  168. )
  169. json_string = completion.choices[0].message.content
  170. print(json_string)
  171. time.sleep(1)
  172. completion = qwclient.chat.completions.create(
  173. # 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
  174. model="ZhipuAI/GLM-4.5",
  175. #model="glm-4.5-flash",
  176. messages=[
  177. {"role": "system", "content": "You are a helpful assistant.请将最终答案以JSON格式输出"},
  178. {"role": "user", "content": " 给你一段文字如下, " + json_string + ",其中给出了一个类似于A=B的表达式作为答案,请将该最终答案输出"},
  179. ],
  180. # Qwen3模型通过enable_thinking参数控制思考过程(开源版默认True,商业版默认False)
  181. # 使用Qwen3开源版模型时,若未启用流式输出,请将下行取消注释,否则会报错
  182. #extra_body={"enable_thinking": False},
  183. extra_body={"thinking": {"type": "disabled"}},
  184. )
  185. json_string = completion.choices[0].message.content
  186. print(json_string)
  187. return json_string
  188. def callzai(A,B,C):
  189. completion = aiclient.chat.completions.create(
  190. # 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
  191. model="glm-4.5-flash",
  192. #model="qwen3-4b",
  193. messages=[
  194. {"role": "system", "content": "You are a helpful assistant."},
  195. {"role": "user", "content": " 给定一条主定额,内容为" + A + ",记作A,再给定一条配套定额,内容为" + B + ",记作B。可以通过简单的组合,来表达对应的工作内容的数量,比如A+B可以表达,主定额的工作量加上配套定额的工作量;再比如,A+B*2可以表达, 主定额的工作量加上两倍的配套定额的工作量;再比如,A+B*(-2)可以表达, 主定额减去两倍的配套定额的工作量;再比如,A可以表示,不使用配套定额,仅表示主定额的工作量。现在给你一条工程量清单,内容为" + C + ",该条清单包含了主定额描述的工作内容,但是数量并不一定一致。请你组合A与B,表示出清单描述的对应工作数量。请输出类似A+B、A+B*2、A-B*2的格式,不要输出A+2*B、A-2*B的格式。如果清单里相应工作量的描述不明确,请输出A作为答案 "},
  196. ],
  197. # Qwen3模型通过enable_thinking参数控制思考过程(开源版默认True,商业版默认False)
  198. # 使用Qwen3开源版模型时,若未启用流式输出,请将下行取消注释,否则会报错
  199. #extra_body={"enable_thinking": False},
  200. extra_body={"thinking": {"type": "disabled"}},
  201. )
  202. json_string = completion.choices[0].message.content
  203. print(json_string)
  204. if len(json_string) < 4:
  205. return json_string
  206. completion = aiclient.chat.completions.create(
  207. # 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
  208. #model="qwen3-4b",
  209. model="glm-4.5-flash",
  210. messages=[
  211. {"role": "system", "content": "You are a helpful assistant.请将最终答案以JSON格式输出"},
  212. {"role": "user", "content": " 给你一段文字如下, " + json_string + ",其中给出了一个类似于A+B的表达式作为答案,请将该最终答案输出"},
  213. ],
  214. # Qwen3模型通过enable_thinking参数控制思考过程(开源版默认True,商业版默认False)
  215. # 使用Qwen3开源版模型时,若未启用流式输出,请将下行取消注释,否则会报错
  216. #extra_body={"enable_thinking": False},
  217. extra_body={"thinking": {"type": "disabled"}},
  218. )
  219. json_string = completion.choices[0].message.content
  220. return json_string
  221. def transform(answer, input, entry):
  222. answers = answer.split("\n")
  223. answers = [x for x in answers if ':' in x and "A" in x]
  224. if len(answers) == 0:
  225. return input
  226. answer2 = answers[0].split(":")[1].replace(" ", "")
  227. answer2 = answer2.replace("A", input)
  228. answer2 = answer2.replace("B", "["+entry+"]")
  229. answer2 = answer2.replace("\'", "")
  230. answer2 = answer2.replace("\"", "")
  231. return answer2
  232. def zuhe(input, content):
  233. if input in incremental:
  234. option = incremental[input]
  235. for entry in option:
  236. answer = callzai(name_label[input], name_label[entry], content)
  237. print("answer of callai for zuhe")
  238. print(answer)
  239. if 'B' in answer:
  240. return transform(answer, input, entry)
  241. return input
  242. else:
  243. return input
  244. def huansuan_highlevel(bianma, label, input,dw, tz):
  245. time.sleep(1)
  246. t = huansuan(input, dw)
  247. if t == 0:
  248. dw1 = input
  249. dw1 = dw1.lower()
  250. dw1 = dw1.replace("水平投影面积", "")
  251. dw2 = name_dw[dw]
  252. dw2 = dw2.lower()
  253. dw2 = dw2.replace("水平投影面积", "")
  254. answer = callzaihuansuan(bianma, label, dw1,dw2,tz, aiclient, qwclient)
  255. answers = answer.split("\n")
  256. answers = [x for x in answers if ':' in x and "A" in x]
  257. answers = [x for x in answers if '=' in x or '<>' in x]
  258. print("answer of callzaihuansuan")
  259. print(answers)
  260. if len(answers) == 0:
  261. return 0
  262. answer2 = answers[0].split(":")[1].replace(" ", "")
  263. if "<>" in answer2:
  264. return 0
  265. answer2 = answer2.replace("\'", "")
  266. answer2 = answer2.replace("\"", "")
  267. answer2 = answer2.split("=")[1]
  268. if answer2 == "B":
  269. return 1
  270. answer2=answer2.replace("B", "")
  271. answer2=answer2.replace("*", "")
  272. answer2=answer2.replace("x", "")
  273. answer2=answer2.replace(",", "")
  274. answer2=answer2.replace(",", "")
  275. answer2=answer2.replace("×", "")
  276. print(answer2)
  277. return float(answer2)
  278. else:
  279. if '人工修边坡' in label:
  280. return t * 0.1
  281. else:
  282. return t
  283. def huansuan(input, dw):
  284. dw1 = input
  285. dw1 = dw1.lower()
  286. dw1 = dw1.replace("水平投影面积", "")
  287. dw2 = name_dw[dw]
  288. dw2 = dw2.lower()
  289. dw2 = dw2.replace("水平投影面积", "")
  290. if dw1 == dw2:
  291. return 1
  292. else:
  293. answer = callzaidw(dw1,dw2)
  294. answers = answer.split("\n")
  295. answers = [x for x in answers if ':' in x and "A" in x]
  296. answers = [x for x in answers if '=' in x or '<>' in x]
  297. print(answers)
  298. if len(answers) == 0:
  299. return 0
  300. answer2 = answers[0].split(":")[1].replace(" ", "")
  301. if "<>" in answer2:
  302. return 0
  303. answer2 = answer2.replace("\'", "")
  304. answer2 = answer2.replace("\"", "")
  305. answer2 = answer2.replace(",", "")
  306. answer2 = answer2.split("=")[1]
  307. if answer2 == "B":
  308. return 1
  309. answer2=answer2.replace("B", "")
  310. answer2=answer2.replace("*", "")
  311. answer2=answer2.replace("x", "")
  312. answer2=answer2.replace("×", "")
  313. print(answer2)
  314. return float(answer2)
  315. def clarify(data):
  316. data['tz'] = data['tz'].replace("水泥基防水涂料", "水泥基渗透结晶防水涂料")
  317. data['tz'] = data['tz'].replace("无机保温砂浆", "无机轻集料保温砂浆")
  318. data['tz'] = data['tz'].replace("JS防水涂料", "聚合物水泥防水涂料")
  319. if data['bianma'].startswith("010301"):##打桩
  320. print("clarify")
  321. result = callzaiclarify(data)
  322. if "是" in result:
  323. data['mc'] = data['mc'] + '填芯'
  324. return data, False
  325. elif data['bianma'].startswith("010507001"): ##散水、坡道
  326. data['tz'] = lingji(data['tz'], aiclient, qwclient)
  327. data['tz'] = dianceng(data['tz'], aiclient, qwclient)
  328. return data, False
  329. elif data['bianma'].startswith("0109"): ##防水
  330. data['tz'] = lingji(data['tz'], aiclient, qwclient)
  331. data['tz'] = dianceng(data['tz'], aiclient, qwclient)
  332. return data, False
  333. elif data['bianma'].startswith("0111"):
  334. data['tz'] = jieheceng(data['tz'], aiclient, qwclient)
  335. result = callzaikuailiao(data)
  336. if '是' in result:
  337. return data, True
  338. return data, False
  339. else:
  340. return data, False
  341. @celery_app.task
  342. def process_data(data:dict)-> dict:
  343. placeholder, kuailiao = clarify(data)
  344. label = data['mc'] + ' ' + data['tz']
  345. if data['bianma'].startswith("0117"):
  346. label = data['label'] + " " + data['mc'] + " " + data['tz']
  347. sentences = [label]
  348. if data['bianma'].startswith("0117"):
  349. embeddings = cuoshi_model.encode(sentences)
  350. else:
  351. embeddings = model.encode(sentences)
  352. if data['bianma'].startswith("0117"):
  353. result = cuoshi_collection.query(query_embeddings=embeddings,n_results=25)
  354. else:
  355. result = collection.query(query_embeddings=embeddings,n_results=25)
  356. d = result['documents'][0]
  357. print(d)
  358. if data['bianma'].startswith("0117"):
  359. ranks = cuoshi_ce.rank(label, d)
  360. else:
  361. ranks = ce.rank(label, d)
  362. if data['bianma'].startswith("0117"):
  363. cutoff = 0.6
  364. else:
  365. cutoff = THRESHOLD
  366. ranks = ranks[:10]
  367. match = [("6.2.1.1","6.3.1.1"),
  368. ("6.2.1.2", "6.3.1.2"),
  369. ("6.2.1.3", "6.3.1.3"),
  370. ("6.2.1.4", "6.3.1.4"),
  371. ("6.2.1.5", "6.3.1.5"),
  372. ("6.2.1.6", "6.3.1.6"),
  373. ("6.2.2.1", "6.3.2.1"),
  374. ("6.2.2.2", "6.3.2.2"),
  375. ("6.2.3.1", "6.3.3.1"),
  376. ("6.2.3.2", "6.3.3.2"),
  377. ("6.2.3.3", "6.3.3.3"),
  378. ("6.2.3.4", "6.3.3.4"),
  379. ("6.2.3.5", "6.3.3.5"),
  380. ("6.2.3.6", "6.3.3.6")]
  381. match2=[
  382. ("1.1.7", "nantong1.1.7"),
  383. ("nantong2.1.2", "2.1.2"),
  384. ("nantong3.1.2", "3.1.2"),
  385. ("nantong3.1.4", "3.1.4"),
  386. ("nantong3.1.5", "3.1.5"),
  387. ("3.2.10", "nantong3.2.10"),
  388. ("nantong4.1.1", "4.1.1"),
  389. ("nantong4.1.2", "4.1.2"),
  390. ("nantong4.1.3", "4.1.3"),
  391. ("4.1.4", "nantong4.1.4"),
  392. ("4.1.5", "nantong4.1.5"),
  393. ("4.1.7", "nantong4.1.7"),
  394. ("4.4", "nantong4.4"),
  395. ("nantong6", "6"),
  396. ("7.5", "nantong7.5"),
  397. ("nantong7.8", "7.8"),
  398. ("10.1.5", "nantong10.1.5"),
  399. ("10.1.2", "nantong10.1.2"),
  400. ("10.1.1", "nantong10.1.1"),
  401. ("nantong10.1.1.2", "10.1.1.2"),
  402. ("10.1.1.3", "nantong10.1.1.3"),
  403. ("nantong11.1.2.1", "11.1.2.1"),
  404. ("nantong11.1.2.2", "11.1.2.2"),
  405. ("nantong11.1.1", "11.1.1"),
  406. ("12.7", "nantong12.7"),
  407. ("12.6", "nantong12.6"),
  408. ("nantong12.5", "12.5"),
  409. ("nantong13.1.1", "13.1.1"),
  410. ("nantong13.1.2" , "13.1.2"),
  411. ("nantong13.1.3", "13.1.3"),
  412. ("nantong13.2.2", "13.2.2"),
  413. ("nantong13.3.1", "13.3.1"),
  414. ("nantong13.3.2", "13.3.2"),
  415. ("13.3.3" ,"nantong13.3.3"),
  416. ("13.4.4", "nantong13.4.4"),
  417. ("nantong13.5.1", "13.5.1"),
  418. ("13.5.4", "nantong13.5.4"),
  419. ("nantong14.3.8", "14.3.8"),
  420. ("14.4.4", "nantong14.4.4"),
  421. ("14.4.6", "nantong14.4.6"),
  422. ("nantong15.3.1", "15.3.1"),
  423. ("16.2", "nantong16.2"),
  424. ("17.1.3.2", "nantong17.1.3.2"),
  425. ("17.1.3.3","nantong17.1.3.3"),
  426. ("17.1.3.4","nantong17.1.3.4"),
  427. ("18.3.3","nantong18.3.3"),
  428. ("18.3.2","nantong18.3.2"),
  429. ("18.5","nantong18.5"),
  430. ("18.6","nantong18.6"),
  431. ("18.15","nantong18.15"),
  432. ("20.1.1","nantong20.1.1"),
  433. ("20.1.2.1","nantong20.1.2.1"),
  434. ("20.1.2.3","nantong20.1.2.3"),
  435. ("20.1.2.5","nantong20.1.2.5"),
  436. ("21.1.1.1","nantong21.1.1.1"),
  437. ("21.1.1.2","nantong21.1.1.2"),
  438. ("21.1.3.1","nantong21.1.3.1"),
  439. ("21.1.3.2","nantong21.1.3.2"),
  440. ("21.1.3.3","nantong21.1.3.3"),
  441. ("21.1.5","nantong21.1.5"),
  442. ("21.1.6","nantong21.1.6"),
  443. ("21.1.7","nantong21.1.7"),
  444. ("23.1.2","nantong23.1.2")
  445. ]
  446. match3=[('16.1', '16.2'), ('16.1.1', '16.2.1')]
  447. selected=[]
  448. notselected=[]
  449. #if data['bianma'].startswith('0108'): ##门窗
  450. # score = -1
  451. # for rank in ranks:
  452. # if label_name[d[rank['corpus_id']]].startswith('16-') and int(label_name[d[rank['corpus_id']]].split('-')[1]) < 308:
  453. # score = rank['score']
  454. # break
  455. # if score > -1 and score < cutoff:
  456. # cutoff = score - 0.1
  457. # if cutoff < 0.3:
  458. # cutoff = 0.3
  459. if data['bianma'].startswith('0106'):##金属结构
  460. score = -1
  461. for rank in ranks:
  462. if label_name[d[rank['corpus_id']]].startswith('7-') and label_name[d[rank['corpus_id']]] != '7-62' and label_name[d[rank['corpus_id']]] !='7-63':
  463. score = rank['score']
  464. break
  465. if score > -1 and score < cutoff:
  466. cutoff = score - 0.05
  467. if cutoff < 0.3:
  468. cutoff = 0.3
  469. if data['bianma'].startswith('0111'):##楼地面
  470. score = -1
  471. for rank in ranks:
  472. if '13.4' in d[rank['corpus_id']] and '块料面层' in d[rank['corpus_id']]:
  473. score = rank['score']
  474. break
  475. if score > -1 and score < cutoff:
  476. cutoff = score - 0.05
  477. if cutoff < 0.3:
  478. cutoff = 0.3
  479. print("cutoff=" + str(cutoff))
  480. for entry in incremental:
  481. notselected = notselected + incremental[entry]
  482. notselected=[name_label[x] for x in notselected]
  483. for rank in ranks:
  484. print(f"{rank['score']} {d[rank['corpus_id']]}")
  485. if rank['score']<cutoff:
  486. continue
  487. if d[rank['corpus_id']] in notselected:
  488. if d[rank['corpus_id']] != '盐城补充定额 盐城补充定额2018 平面立面及其它防水 涂刷油类 水泥基渗透结晶防水每增减0.5mm厚':
  489. continue
  490. else:
  491. d[rank['corpus_id']]= '第十章 屋面及防水工程 10.2 平面立面及其它防水 10.2.1 涂刷油类 水泥基渗透结晶 防水材料 二~三遍(厚2mm)'
  492. if d[rank['corpus_id']] in notselected:
  493. continue
  494. print(f"select {rank['score']} {d[rank['corpus_id']]}")
  495. selected.append(d[rank['corpus_id']])
  496. hunningtu_group = []
  497. for entry in obj:
  498. if d[rank['corpus_id']] in obj[entry]:
  499. hunningtu_group=[entry]
  500. if len(hunningtu_group) > 0:
  501. for entry in match:
  502. if entry[0]==hunningtu_group[0] or entry[1] == hunningtu_group[0]:
  503. notselected = notselected + obj[entry[0]]
  504. notselected = notselected + obj[entry[1]]
  505. menchuang_group = []
  506. for entry in menchuang:
  507. if d[rank['corpus_id']] in menchuang[entry]:
  508. menchuang_group=[entry]
  509. if len(menchuang_group) > 0:
  510. for entry in match3:
  511. if entry[0]==menchuang_group[0] or entry[1] == menchuang_group[0]:
  512. notselected = notselected + menchuang[entry[0]]
  513. notselected = notselected + menchuang[entry[1]]
  514. nantong_group = []
  515. for entry in obj2:
  516. if d[rank['corpus_id']] in obj2[entry]:
  517. nantong_group=[entry]
  518. if len(nantong_group) > 0:
  519. for entry in match2:
  520. if entry[0]==nantong_group[0] or entry[1] == nantong_group[0]:
  521. notselected = notselected + obj2[entry[0]]
  522. notselected = notselected + obj2[entry[1]]
  523. for entry in basic:
  524. if d[rank['corpus_id']] in basic[entry]:
  525. notselected = notselected + basic[entry]
  526. notselected = [x for x in notselected if x not in selected]
  527. selected = list(set(selected))
  528. if len(selected) == 0:
  529. candidates=[]
  530. for rank in ranks:
  531. candidates.append(d[rank['corpus_id']])
  532. selected = fallback(candidates, data, aiclient, qwclient, menchuang_collection, model)
  533. selected = postprocess(selected, data, aiclient, qwclient,sfclient, label_name, name_dw)
  534. print("final selected")
  535. print(selected)
  536. result = [(label_name[x], huansuan_highlevel(data['bianma'], x, data['dw'], label_name[x], data['mc']+data['tz'])) for x in selected]
  537. print("after haunsuan")
  538. print(result)
  539. result = [(zuhe(x[0], label), x[1]) for x in result]
  540. print("after zuhe")
  541. print(result)
  542. result = [(x[0], x[1], dedata.read_singledexilie2(10, x[0])) for x in result]
  543. need = need_extra(data, aiclient, qwclient, result)
  544. if need:
  545. extra_info = extra(data, aiclient, qwclient, menchuang_collection, model)
  546. else:
  547. extra_info = "无"
  548. response = requests.post("http://localhost:3000/api/transform", json={'bianma': data['bianma'], 'mc': data['mc'], 'tz': data['tz'], 'dw': data['dw'], 'sl': data['sl'], 'n': data['n'], "extra": extra_info, 'result': result})
  549. return {"result": response.json()}