From d9ffa090a9aee5ff5fea3a5b4541dd3ad402ce9b Mon Sep 17 00:00:00 2001 From: xlt-evil Date: Fri, 21 Apr 2023 17:33:56 +0800 Subject: [PATCH] init project --- 0825-丽水系统查重维度1.xlsx | Bin 0 -> 17033 bytes __pycache__/cosin_similarity.cpython-36.pyc | Bin 0 -> 2351 bytes __pycache__/main1.cpython-36.pyc | Bin 0 -> 12726 bytes __pycache__/mysql_pool.cpython-36.pyc | Bin 0 -> 2381 bytes cosin_similarity.py | 84 ++++ flask_server.py | 42 ++ insert_history_data_total.py | 283 ++++++++++++ main1.py | 577 +++++++++++++++++++++++++ main10.py | 391 +++++++++++++++++ mysql_pool.py | 113 +++++ requirements.txt | 41 ++ 水路运输综合监管系统建设项目.xls | Bin 0 -> 78336 bytes 12 files changed, 1531 insertions(+) create mode 100644 0825-丽水系统查重维度1.xlsx create mode 100644 __pycache__/cosin_similarity.cpython-36.pyc create mode 100644 __pycache__/main1.cpython-36.pyc create mode 100644 __pycache__/mysql_pool.cpython-36.pyc create mode 100644 cosin_similarity.py create mode 100644 flask_server.py create mode 100644 insert_history_data_total.py create mode 100644 main1.py create mode 100644 main10.py create mode 100644 mysql_pool.py create mode 100644 requirements.txt create mode 100644 水路运输综合监管系统建设项目.xls diff --git a/0825-丽水系统查重维度1.xlsx b/0825-丽水系统查重维度1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d8064be972246782642d86182d773e7927fdad97 GIT binary patch literal 17033 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 C!&FcJ literal 0 HcmV?d00001 diff --git a/__pycache__/main1.cpython-36.pyc b/__pycache__/main1.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f370b75265edcea33d0e23dcafff2a11b6ee67d2 GIT binary patch literal 12726 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 YPy3!fm+Dlz)d$o+m+0$Jy>9gIzh6Q&LI3~& literal 0 HcmV?d00001 diff --git a/__pycache__/mysql_pool.cpython-36.pyc b/__pycache__/mysql_pool.cpython-36.pyc new file mode 100644 index 0000000000000000000000000000000000000000..621bc661d465a18303fc553ce6ae1336e1f51184 GIT binary patch literal 2381 zcma)7&u`pB6rQoYUa!}?o1~>pT13+dftJIHriGSLp+Z_{K}3;gg*1v}IiAVJ8~@nO z%!(#TPg{vo{{v1OkocG8$|?K_91!n~H`yeu09*e2Jo9Ge&G)`}zSZf3fB*b4{dS3v zKgg-81NH-W)NcTsaGDc_ZzrdP!yHPu%RS!UK5z1Xw|?=N`wihCZ@(hEExf7A8p7w% zo+E$d9p23-V9(-$#YKxt7B5)5Xz?A3mn>ekxNLDHqr-?2(U=m}6oF`o<|yP>rW9|8 zhW5)=nadsSz9P&M4J7OpnNsE>ZO~?^gLlBYmO9E>JmMW_3GIe@rnO#`<@fvQ zdA^ZSm>4g7<7(^hs2c#9jOdgclGr&UBWL7lZ`2t1oW7>e*5m}JagY^1ok&&5ejwX0 z%Jkx)&~bs2$0;mhytJxH2|N(f9Pir>)~v@U7Cy{Uy>2HkE;Pb?o)Y=a??i%j$X}nY z-`jcye5tL+&%XTe(UYyseWa<_l+{S2T5Xm2c#BWQak?wgy{&rLF{EiQ-Zw!UXJw}2 z_ySC&JOJW^^kC^^_k&}HGn_AipJiba3}k_my+A(Jj&?ak-mOH*kZ@mnytzUE1B)$- zp~bevXoc|3>s~@N9f8Pzv+l+bQhn4w@DY&pr$-K;#72pYvWXBNv=Bmoeh+w)BGHv( zts*Pa1UAjVOkT{)E}FnOFq2iKvRw-365Isad6n*gLRkP#6O{}F3qfs4Ct zS`|g6`>sSK7#EbxLQq{f6fxN6_F=kK>2-IZh9AQig()O7qM)|rdC+Ga|4+;iDaP+i z2}D1O*|jmt_h1DU>_ENPtx7QqR$hZv19{Cs0)3!b zp$3$Y=^>-DAaUG%XjFJqko$l}&RNl%^FCAh@Jw3KEQ3++$qEHaACy7(7vSLq$+%V| zrjh0q)FqTppVrZy3$7_43yBhsz@;ueD2K(l9A^DEX&Y-*nG_<9O&G^T#V0x1Q5-*? zBzfHpV@ibD^M!#_%s=?r@Yc4`7W2@Evn8)~t=zxUR-*@zh6Mk=gPa zO)yR;Spf$^R(5vnP49YzVBFU{>xT&~HR9xqfHK{Riz?LWBSS literal 0 HcmV?d00001 diff --git a/cosin_similarity.py b/cosin_similarity.py new file mode 100644 index 0000000..d315a2a --- /dev/null +++ b/cosin_similarity.py @@ -0,0 +1,84 @@ +# coding=utf-8 +import re +import html +import jieba +import jieba.analyse +from sklearn.metrics.pairwise import cosine_similarity + + +class CosineSimilarity(object): + """ + 余弦相似度 + """ + def __init__(self, content_x1, content_y2): + self.s1 = content_x1 + self.s2 = content_y2 + + @staticmethod + def extract_keyword(content): # 提取关键词 + # 正则过滤 html 标签 + re_exp = re.compile(r'()|(<[^>]+>)', re.S) + content = re_exp.sub(' ', content) + # html 转义符实体化 + content = html.unescape(content) + # 切割 + seg = [i for i in jieba.cut(content, cut_all=True) if i != ''] + # 提取关键词 + keywords = jieba.analyse.extract_tags("|".join(seg), topK=200, withWeight=False, allowPOS=('n', 'nr', 'ns')) + # print(keywords) + # return keywords + return seg,keywords + + @staticmethod + def one_hot(word_dict, keywords): # oneHot编码 + # cut_code = [word_dict[word] for word in keywords] + cut_code = [0]*len(word_dict) + for word in keywords: + cut_code[word_dict[word]] += 1 + return cut_code + + def main(self): + # 去除停用词 + # jieba.analyse.set_stop_words('stopword1.txt') + + # 提取关键词 + # keywords1 = self.extract_keyword(self.s1) + # keywords2 = self.extract_keyword(self.s2) + seg1,keywords1 = self.extract_keyword(self.s1) + seg2,keywords2 = self.extract_keyword(self.s2) + # 词的并集 + union = set(keywords1).union(set(keywords2)) + # union = set(seg1).union(set(seg2)) + + # 编码 + word_dict = {} + i = 0 + for word in union: + word_dict[word] = i + i += 1 + # oneHot编码 + s1_cut_code = self.one_hot(word_dict, keywords1) + s2_cut_code = self.one_hot(word_dict, keywords2) + # s1_cut_code = self.one_hot(word_dict, seg1) + # s2_cut_code = self.one_hot(word_dict, seg2) + # 余弦相似度计算 + sample = [s1_cut_code, s2_cut_code] + # 除零处理 + try: + sim = cosine_similarity(sample) + return sim[1][0],keywords1,keywords2 + except Exception as e: + print(e) + return 0.0,keywords1,keywords2 + + +# 测试 +if __name__ == '__main__': + with open(r'D:\pythonDM\Ndkj\live111\result\1.txt', encoding='UTF-8') as x, open(r'D:\pythonDM\Ndkj\live111\result\2.txt', encoding='UTF-8') as y: + content_x = x.read() + content_y = y.read() + similarity = CosineSimilarity(content_x, content_y) + # similarity = CosineSimilarity(file, file2) + similarity = similarity.main() + print(similarity) + print('相似度: %.2f%%' % (similarity*32)) diff --git a/flask_server.py b/flask_server.py new file mode 100644 index 0000000..a78885a --- /dev/null +++ b/flask_server.py @@ -0,0 +1,42 @@ +# coding=utf-8 +from flask import Flask, redirect, url_for, request +import sys +from flask import jsonify +import mysql_pool +import main1 +import cosin_similarity + +# import xm +# from xm import xsd + +app = Flask(__name__) + + +# mysql = mysql_pool.ConnMysql() + + +# 返回excel的保存地址 +@app.route('/check/duplicates/') +def success(projectId): + mysql=mysql_pool.ConnMysql() + if int(projectId) == 0: + data = mysql.sql_select_many("""select * from idc_project""") + else: + data = mysql.sql_select_many("""select * from idc_project where project_id=%s""" % projectId) + print(data) + data_list = [] + + for ap in data: + # if os.path.exists(ap.get("file_path")): + data_list.append((ap.get("project_id"), ap.get("file_path"), ap.get("project_name"))) + mysql.release() + # print(data_list) + main1.project_check(data_list) + + return jsonify({"code": 0, "data": data}) + + +# 去数据库idc_project里面拿数据,获取比如project_id=11,根据file_path地址拿到要开始处理的数据 +if __name__ == '__main__': + # app.run(host="0.0.0.0", port=19099) + app.run(port=19099) diff --git a/insert_history_data_total.py b/insert_history_data_total.py new file mode 100644 index 0000000..fbcb312 --- /dev/null +++ b/insert_history_data_total.py @@ -0,0 +1,283 @@ +# coding=utf-8 + +import re +import mysql_pool +from pymysql.converters import escape_string +import cosin_similarity +import pandas as pd +import datetime +import requests +import os + +wdys1 = { + "项目名称": "xmmc", + "现状问题": "xzwt", + "系统基础": "xtjc", + "项目目标": "xmmb", + "预期绩效": "yqjx", + "建设需求": "jsxq", + "数据需求": "sjxq", + "安全需求": "aqxq", + "业务领域": "ywly", + "核心业务": "hxyw", + "业务需求": "ywxq", + "业务协同": "ywxt", + "建设层级": "jscj", + "用户范围": "yhfw", + "目标群体": "mbqt", + "建设内容": "jsnr", + "功能模块": "gnmk", + "数据共享": "sjgx", + "智能要素": "znys", + "申报单位": "sbdw", + "所属地区": "ssdq", + "预算年度": "ysnd" +} +wdys2 = { + "xmmc": "项目名称", + "xzwt": "现状问题", + "xtjc": "系统基础", + "xmmb": "项目目标", + "yqjx": "预期绩效", + "jsxq": "建设需求", + "sjxq": "数据需求", + "aqxq": "安全需求", + "ywly": "业务领域", + "hxyw": "核心业务", + "ywxq": "业务需求", + "ywxt": "业务协同", + "jscj": "建设层级", + "yhfw": "用户范围", + "mbqt": "目标群体", + "jsnr": "建设内容", + "gnmk": "功能模块", + "sjgx": "数据共享", + "znys": "智能要素", + "sbdw": "申报单位", + "ssdq": "所属地区", + "ysnd": "预算年度" +} +gnmkys = { + "gnmc": "功能名称", + "gnms": "功能描述" +} + + +def getFlag(): + data_dict = {} + df = pd.read_excel("0825-丽水系统查重维度.xlsx") + data = df.values + data = list(pd.Series(data[:, 1]).dropna()) + for d in data: + try: + wd = re.search("(.*?)(.*?%)", d).group(1).strip() + wdc = wdys1.get(wd) + if wdc: + qz = re.search(".*?((.*?%))", d).group(1) + data_dict[wdc] = qz + except: + pass + return data_dict + + +def gong_neng_mo_kuai(xmmc, mysql, dl, data, er_title): + # 将excel文件中的所有第三维度内容进行拼接 + str_dict = {} + for et in er_title: + for d in data: + if d[1] == et: + if str_dict.get(et): + str_dict[et] = str_dict.get(et) + d[3] + else: + str_dict[et] = d[3] + for k, v in str_dict.items(): + mysql.sql_change_msg("""insert into user_history_module_data_total(xmmc,gnmc,gnms) value("%s", "%s", "%s")""" % ( + escape_string(xmmc), escape_string(k), escape_string(v))) + # + # similarity = cosin_similarity.CosineSimilarity(v, v) + # similarity, keywords_x, keywords_y = similarity.main() + # mysql.sql_change_msg("""insert into user_history_module_keywords (xmmc,gnmc,gnms) value("%s" ,"%s", "%s")""" % ( + # xmmc, escape_string(k), str(keywords_y)[dup_file_test:-dup_file_test])) + + +def project_check(data_list): + mysql = mysql_pool.ConnMysql() + # 读取维度和权重 + # get_data_dict = getFlag() + # 遍历excel存储路径 + for dl in data_list: + # path = "0825-丽水系统查重维度1.xlsx" + # 读取路径下的excel + print(dl) + df = pd.read_excel(dl[1]) + xmmc = df.keys() + # print(type(xmmc[dup_file_test])) + xmmc=xmmc[1] + # print(type(xmmc)) + # xmmc1='' + + if "可研报告"or "可研性报告"or "可行性研究报告" in xmmc: + xmmc=xmmc.replace('可研报告','') + xmmc=xmmc.replace('可研性报告','') + xmmc=xmmc.replace('可行性研究报告','') + # print(xmmc) + data = df.values + # 将excel文件中的所有维度内容进行拼接 + join_str = "" + str_dict = {} + title = "" + er_title = set() + # for d in data: + # # print(d) + # if pd.notnull(d[0]): + # title = d[0] + # if title == "功能模块": + # er_title.add(d[dup_file_test]) + # join_str = "" + # for i in d[dup_file_test:]: + # if pd.notnull(i): + # join_str += i + # str_dict[wdys1.get(title)] = join_str + # else: + # if title == "功能模块": + # er_title.add(d[dup_file_test]) + # for i in d[dup_file_test:]: + # if pd.notnull(i): + # join_str += i + # str_dict[wdys1.get(title)] = str_dict.get(wdys1.get(title)) + join_str + # print(str_dict) + gnmk_str = [] + # print(data) + for d in data: + if pd.notnull(d[0]): + title = d[0] + if title == "功能模块": + er_title.add(d[1]) + join_str = "" + for i in d[1:]: + # print(type(i)) + # i=str(i) + if pd.notnull(i): + join_str += str(i) + if title == "功能模块": + # for j in d[3:]: + if i == '功能描述': + continue + else: + gnmk_str.append(i) + str_dict[wdys1.get(title)] = join_str + # print(str_dict.get(wdys1.get(title))) + else: + if title == "功能模块": + er_title.add(d[1]) + for i in d[3:]: + if pd.notnull(i): + join_str += str(i) + if title == "功能模块": + gnmk_str.append(i) + str_dict[wdys1.get(title)] = str_dict.get(wdys1.get(title)) + join_str + # gnmk="".join(gnmk_str) + # str_dict['gnmk']=gnmk + gnmk = "".join(gnmk_str) + str_dict['gnmk'] = gnmk + # print(str_dict) + # print(str_dict.get("xzwt")if str_dict.get("xzwt") else None) + # print(str_dict.get('gnmk')if str_dict.get('gnmk')else None) + mysql.sql_change_msg( + """insert into user_history_data_total (xmmc, xzwt, xtjc, xmmb, yqjx, jsxq, sjxq, aqxq, ywly, hxyw, ywxq, ywxt, jscj, yhfw, mbqt, jsnr, gnmk, sjgx, znys,sbdw,ssdq,ysnd) value ("%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s","%s","%s","%s")""" + % (escape_string(xmmc), + escape_string(str_dict.get("xzwt")) if str_dict.get("xzwt") else None, + escape_string(str_dict.get("xtjc")) if str_dict.get("xtjc") else None, + escape_string(str_dict.get("xmmb")) if str_dict.get("xmmb") else None, + escape_string(str_dict.get("yqjx")) if str_dict.get("yqjx") else None, + escape_string(str_dict.get("jsxq")) if str_dict.get("jsxq") else None, + escape_string(str_dict.get("sjxq")) if str_dict.get("sjxq") else None, + escape_string(str_dict.get("aqxq")) if str_dict.get("aqxq") else None, + escape_string(str_dict.get("ywly")) if str_dict.get("ywly") else None, + escape_string(str_dict.get("hxyw")) if str_dict.get("hxyw") else None, + escape_string(str_dict.get("ywxq")) if str_dict.get("ywxq") else None, + escape_string(str_dict.get("ywxt")) if str_dict.get("ywxt") else None, + escape_string(str_dict.get("jscj")) if str_dict.get("jscj") else None, + escape_string(str_dict.get("yhfw")) if str_dict.get("yhfw") else None, + escape_string(str_dict.get("mbqt")) if str_dict.get("mbqt") else None, + escape_string(str_dict.get("jsnr")) if str_dict.get("jsnr") else None, + escape_string(str_dict.get("gnmk")) if str_dict.get("gnmk") else None, + escape_string(str_dict.get("sjgx")) if str_dict.get("sjgx") else None, + escape_string(str_dict.get("znys")) if str_dict.get("znys") else None, + escape_string(str_dict.get("sbdw")) if str_dict.get("sbdw") else None, + escape_string(str_dict.get("ssdq")) if str_dict.get("ssdq") else None, + escape_string(str_dict.get("ysnd")) if str_dict.get("ysnd") else None + )) + # project_gjc = {} + # for w in wdys2.keys(): + # content_x = str_dict.get(w) + # content_y = str_dict.get(w) + # if content_x and content_y: + # # 循环遍历每一个维度 + # similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # # 相似度 关键词 + # similarity, keywords_x, keywords_y = similarity.main() + # project_gjc[w] = keywords_y + # mysql.sql_change_msg( + # """insert into user_history_keywords (xmmc, xzwt, xtjc, xmmb, yqjx, jsxq, sjxq, aqxq, ywly, hxyw, ywxq, ywxt, jscj, yhfw, mbqt, jsnr, gnmk, sjgx, znys) value ("%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s")""" + # % (xmmc, str(project_gjc.get("xzwt"))[dup_file_test:-dup_file_test] if project_gjc.get("xzwt") else None, + # str(project_gjc.get("xtjc"))[dup_file_test:-dup_file_test] if project_gjc.get("xtjc") else None, + # str(project_gjc.get("xmmb"))[dup_file_test:-dup_file_test] if project_gjc.get("xmmb") else None, + # str(project_gjc.get("yqjx"))[dup_file_test:-dup_file_test] if project_gjc.get("yqjx") else None, + # str(project_gjc.get("jsxq"))[dup_file_test:-dup_file_test] if project_gjc.get("jsxq") else None, + # str(project_gjc.get("sjxq"))[dup_file_test:-dup_file_test] if project_gjc.get("sjxq") else None, + # str(project_gjc.get("aqxq"))[dup_file_test:-dup_file_test] if project_gjc.get("aqxq") else None, + # str(project_gjc.get("ywly"))[dup_file_test:-dup_file_test] if project_gjc.get("ywly") else None, + # str(project_gjc.get("hxyw"))[dup_file_test:-dup_file_test] if project_gjc.get("hxyw") else None, + # str(project_gjc.get("ywxq"))[dup_file_test:-dup_file_test] if project_gjc.get("ywxq") else None, + # str(project_gjc.get("ywxt"))[dup_file_test:-dup_file_test] if project_gjc.get("ywxt") else None, + # str(project_gjc.get("jscj"))[dup_file_test:-dup_file_test] if project_gjc.get("jscj") else None, + # str(project_gjc.get("yhfw"))[dup_file_test:-dup_file_test] if project_gjc.get("yhfw") else None, + # str(project_gjc.get("mbqt"))[dup_file_test:-dup_file_test] if project_gjc.get("mbqt") else None, + # str(project_gjc.get("jsnr"))[dup_file_test:-dup_file_test] if project_gjc.get("jsnr") else None, + # str(project_gjc.get("gnmk"))[dup_file_test:-dup_file_test] if project_gjc.get("gnmk") else None, + # str(project_gjc.get("sjgx"))[dup_file_test:-dup_file_test] if project_gjc.get("sjgx") else None, + # str(project_gjc.get("znys"))[dup_file_test:-dup_file_test] if project_gjc.get("znys") else None)) + + gong_neng_mo_kuai(xmmc, mysql, dl, data, er_title) + + +if __name__ == "__main__": + path = r"D:\dup_file_test" + data_list = os.listdir(path) + print(len(data_list)) + for file in data_list: + # print(path+'\\'+file) + data_list = [(0, path + '\\' + file, "")] + project_check(data_list) + print("已存入************************************* %s" % file) + +""" +建设目标,业务功能 + +gnmk_str = [] +for d in data: + if pd.notnull(d[0]): + title = d[0] + if title == "功能模块": + er_title.add(d[dup_file_test]) + join_str = "" + for i in d[dup_file_test:]: + if pd.notnull(i): + join_str += i + if title == "功能模块": + gnmk_str.append(i) + str_dict[wdys1.get(title)] = join_str + else: + if title == "功能模块": + er_title.add(d[dup_file_test]) + for i in d[dup_file_test:]: + if pd.notnull(i): + join_str += i + if title == "功能模块": + gnmk_str.append(i) + str_dict[wdys1.get(title)] = str_dict.get(wdys1.get(title)) + join_str +gnmk = "".join(gnmk_str) + + +""" diff --git a/main1.py b/main1.py new file mode 100644 index 0000000..a23d097 --- /dev/null +++ b/main1.py @@ -0,0 +1,577 @@ +# coding=utf-8 +import sys +import re +import mysql_pool +from pymysql.converters import escape_string +import cosin_similarity +import pandas as pd +import datetime +import requests +import os +import pymysql + +wdys1 = { + "项目名称": "xmmc", + "现状问题": "xzwt", + "系统基础": "xtjc", + "项目目标": "xmmb", + "预期绩效": "yqjx", + "建设需求": "jsxq", + "数据需求": "sjxq", + "安全需求": "aqxq", + "业务领域": "ywly", + "核心业务": "hxyw", + "业务需求": "ywxq", + "业务协同": "ywxt", + "建设层级": "jscj", + "用户范围": "yhfw", + "目标群体": "mbqt", + "建设内容": "jsnr", + "功能模块": "gnmk", + "数据共享": "sjgx", + "智能要素": "znys" +} +wdys2 = { + "xmmc": "项目名称", + "xzwt": "现状问题", + "xtjc": "系统基础", + "xmmb": "项目目标", + "yqjx": "预期绩效", + "jsxq": "建设需求", + "sjxq": "数据需求", + "aqxq": "安全需求", + "ywly": "业务领域", + "hxyw": "核心业务", + "ywxq": "业务需求", + "ywxt": "业务协同", + "jscj": "建设层级", + "yhfw": "用户范围", + "mbqt": "目标群体", + "jsnr": "建设内容", + "gnmk": "功能模块", + "sjgx": "数据共享", + "znys": "智能要素" +} +gnmkys = { + "gnmc": "功能名称", + "gnms": "功能描述" +} + + +def getFlag(): + data_dict = {} + df = pd.read_excel("0825-丽水系统查重维度.xlsx") + data = df.values + data = list(pd.Series(data[:, 1]).dropna()) + for d in data: + try: + wd = re.search("(.*?)(.*?%)", d).group(1).strip() + wdc = wdys1.get(wd) + if wdc: + qz = re.search(".*?((.*?%))", d).group(1) + data_dict[wdc] = qz + except: + pass + return data_dict + + +def gong_neng_mo_kuai(mysql, dl, data, er_title): + # 将excel文件中的所有第三维度内容进行拼接 + str_dict = {} + for et in er_title: + for d in data: + if d[1] == et: + if str_dict.get(et): + str_dict[et] = str_dict.get(et) + d[3] + else: + str_dict[et] = d[3] + + for k, v in str_dict.items(): + mysql.sql_change_msg( + """insert into idc_project_module (project_id, check_duplicate_count, module_name, module_content, create_time, update_time, tag) value(%d, dup_file_test, "%s", "%s", "%s", "%s", "模块")""" % ( + int(dl[0]), k, v, str(datetime.datetime.now())[:-7], str(datetime.datetime.now())[:-7])) + + module_id_list = mysql.sql_select_many( + """select project_module_id, module_name, module_content from idc_project_module where project_id=%d""" % dl[ + 0]) + data_list = [] + for mil in module_id_list: + data_dict = {} + data_dict["project_module_id"] = mil.get("project_module_id") + data_dict["gnmc"] = mil.get("module_name") + data_dict["gnms"] = mil.get("module_content") + data_list.append(data_dict) + # print(data_list) + for i in data_list: + gnmk_copy1 = mysql.sql_select_many("""select * from user_history_module_data""") + if gnmk_copy1: + for gc in gnmk_copy1: + total_similarity1 = 0 + total_keywords1 = [] + total_similarity2 = 0 + total_keywords2 = [] + mysql.sql_change_msg( + """insert into idc_project_module_check (project_module_id, module_name, project_name, company_name, create_time, update_time) value(%d, "%s", "%s", "%s", "%s", "%s")""" + % ( + i.get("project_module_id"), gc.get("gnmc"), gc.get("xmmc"), "", + str(datetime.datetime.now())[:-7], + str(datetime.datetime.now())[:-7])) + dup_module_id = mysql.cur.lastrowid + for j in ["gnmc", "gnms"]: + # 循环遍历每一个模块名称 + content_x = gc.get(j) + content_y = i.get(j) + if content_x and content_y: + if j == "gnmc": + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keyword_x, keywords = similarity.main() + similarity = similarity * 1 + total_keywords1 += keywords + #print("######################相似度: %.2f%%" % similarity, "关键词: %s" % keywords) + # 相似度相加 + total_similarity1 += similarity + mysql.sql_change_msg( + """insert into idc_project_module_check_detail (dup_module_id, project_name, module_content, dup_module_content, similarity, dimension, create_time, update_time) value (%d, "%s", "%s", "%s", %f, "%s", "%s", "%s")""" + % (dup_module_id, dl[2], escape_string(content_y), escape_string(content_x), similarity, + "功能名称", + str(datetime.datetime.now())[:-7], str(datetime.datetime.now())[:-7])) + else: + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keyword_x, keywords = similarity.main() + similarity = similarity * 99 + total_keywords2 += keywords + #print("######################相似度: %.2f%%" % similarity, "关键词: %s" % keywords) + # 相似度相加 + total_similarity2 += similarity + mysql.sql_change_msg( + """insert into idc_project_module_check_detail (dup_module_id, project_name, module_content, dup_module_content, similarity, dimension, create_time, update_time) value (%d, "%s", "%s", "%s", %f, "%s", "%s", "%s")""" + % (dup_module_id, dl[2], escape_string(content_y), escape_string(content_x), similarity, + "功能模块描述", + str(datetime.datetime.now())[:-7], str(datetime.datetime.now())[:-7])) + mysql.sql_change_msg("""update idc_project_module_check set similarity=%f where dup_module_id=%d""" % ( + total_similarity1 + total_similarity2, dup_module_id)) + gnmk_gjc = {} + for a in ["gnmc", "gnms"]: + if i.get(a): + content_x = i.get(a) + content_y = i.get(a) + if a == "gnmc": + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keyword_x, keywords = similarity.main() + gnmk_gjc[a] = keywords + else: + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keyword_x, keywords = similarity.main() + gnmk_gjc[a] = keywords + mysql.sql_change_msg("""insert into user_module_keywords (xmmc, gnmc, gnms) value("%s", "%s", "%s")""" % ( + dl[2], str(gnmk_gjc.get("gnmc"))[1:-1] if gnmk_gjc.get("gnmc") else None, + str(gnmk_gjc.get("gnms"))[1:-1] if gnmk_gjc.get("gnms") else None)) + + +def project_check(data_list): + mysql = mysql_pool.ConnMysql() + # mysql.sql_select_many("""select * from mkgjc""") + # 读取维度和权重 + # xmnr_count = len(mysql.sql_select_many("""select * from xmnr_copy1""")) + # gnmk_count = len(mysql.sql_select_many("""select * from gnmk_copy1""")) + xmnr_count = len(mysql.sql_select_many("""select * from user_history_data""")) + gnmk_count = len(mysql.sql_select_many("""select * from user_history_module_data""")) + get_data_dict = getFlag() + # 遍历excel存储路径 + for dl in data_list: + # path = "0825-丽水系统查重维度1.xlsx" + # 读取路径下的excel + print(dl,dl[1]) + df = pd.read_excel(dl[1]) + data = df.values + # 将excel文件中的所有维度内容进行拼接 + join_str = "" + str_dict = {} + title = "" + er_title = set() + for d in data: + if pd.notnull(d[0]): + title = d[0] + if title == "功能模块": + er_title.add(d[1]) + join_str = "" + for i in d[1:]: + if pd.notnull(i): + join_str += i + str_dict[wdys1.get(title)] = join_str + else: + if title == "功能模块": + er_title.add(d[1]) + for i in d[1:]: + if pd.notnull(i): + join_str += i + str_dict[wdys1.get(title)] = str_dict.get(wdys1.get(title)) + join_str + print(str_dict) + mysql.sql_change_msg( + """insert into user_data (xmmc, xzwt, xtjc, xmmb, yqjx, jsxq, sjxq, aqxq, ywly, hxyw, ywxq, ywxt, jscj, yhfw, mbqt, jsnr, gnmk, sjgx, znys) value ("%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s")""" + % (dl[0], str_dict.get("xzwt") if str_dict.get("xzwt") else None, + str_dict.get("xtjc") if str_dict.get("xtjc") else None, + str_dict.get("xmmb") if str_dict.get("xmmb") else None, + str_dict.get("yqjx") if str_dict.get("yqjx") else None, + str_dict.get("jsxq") if str_dict.get("jsxq") else None, + str_dict.get("sjxq") if str_dict.get("sjxq") else None, + str_dict.get("aqxq") if str_dict.get("aqxq") else None, + str_dict.get("ywly") if str_dict.get("ywly") else None, + str_dict.get("hxyw") if str_dict.get("hxyw") else None, + str_dict.get("ywxq") if str_dict.get("ywxq") else None, + str_dict.get("ywxt") if str_dict.get("ywxt") else None, + str_dict.get("jscj") if str_dict.get("jscj") else None, + str_dict.get("yhfw") if str_dict.get("yhfw") else None, + str_dict.get("mbqt") if str_dict.get("mbqt") else None, + str_dict.get("jsnr") if str_dict.get("jsnr") else None, + str_dict.get("gnmk") if str_dict.get("gnmk") else None, + str_dict.get("sjgx") if str_dict.get("sjgx") else None, + str_dict.get("znys") if str_dict.get("znys") else None)) + # 或取所有的xmnr_copy1 + xmnr_copy1 = mysql.sql_select_many("""select * from user_history_data""") + # 对比xmnr_copy1和xmnr维度是否都有 + if xmnr_copy1: + for xc in xmnr_copy1: + total_keywords = {} + total_similarity = 0 + dup_count = 0 + # 保存相加后的相似度到idc_project_check + mysql.sql_change_msg( + """insert into idc_project_check (project_id, dup_project_name, file_path, company_name, create_year, project_tag, project_range_tag, project_area, create_time, update_time) value ("%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s")""" + % (dl[0], xc.get("xmmc"), dl[1], "", "", "需求相似、业务相似", "历史项目", "", + str(datetime.datetime.now())[:-7], str(datetime.datetime.now())[:-7])) + dup_id = mysql.cur.lastrowid + for x in list(xc.keys())[1:]: + content_x = xc.get(x) + content_y = str_dict.get(x) + if content_x and content_y: + if x == 'gnmk': + continue + elif x == 'jsnr': + continue + else: + dup_count += 1 + if xc.get('gnmk')==' ' and str_dict.get('gnmk')==' ': + for x in list(xc.keys())[1:]: + content_x = xc.get(x) + content_y = str_dict.get(x) + if content_x and content_y: + if x == 'gnmk': + # 匹配到历史数据,次数加1 + # dup_count += dup_file_test + # 循环遍历每一个维度 + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keywords_x, keywords_y = similarity.main() + similarity = similarity * 0 + #print("**************相似度: %.2f%%" % similarity, "关键词: %s" % keywords_y) + # 相似度相加 + total_similarity += similarity + # 关键词收集 + total_keywords[x] = keywords_y + + function_content = content_y + dup_function_content = content_x + for word_y in keywords_y: + word_y = word_y.strip().strip("'").strip('"') + function_content = str(function_content.replace("\"", "'")).replace(word_y, + f'{word_y.strip()}') + for word_x in keywords_x: + word_x = word_x.strip().strip("'").strip('"') + dup_function_content = str(dup_function_content.replace("\"", "'")).replace(word_x, + f'{word_x.strip()}') + # 保存每个维度对应的相似度到idc_project_check_detail + mysql.sql_change_msg( + """insert into idc_project_check_detail (dup_id, dimension, similarity, function_content, dup_function_content, create_time, update_time) value (%d, "%s", %f, "%s", "%s", "%s", "%s")""" + % (dup_id, wdys2.get(x), similarity, escape_string(function_content), + escape_string(dup_function_content), str(datetime.datetime.now())[:-7], + str(datetime.datetime.now())[:-7])) + # content = content.replace(gjcs, f'{gjcs.strip()}') + elif x == 'jsnr': + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keywords_x, keywords_y = similarity.main() + similarity = similarity * 40 + #print("**************相似度: %.2f%%" % similarity, "关键词: %s" % keywords_y) + # 相似度相加 + total_similarity += similarity + # 关键词收集 + total_keywords[x] = keywords_y + function_content = content_y + dup_function_content = content_x + for word_y in keywords_y: + word_y = word_y.strip().strip("'").strip('"') + function_content = str(function_content.replace("\"", "'")).replace(word_y, + f'{word_y.strip()}') + for word_x in keywords_x: + word_x = word_x.strip().strip("'").strip('"') + dup_function_content = str(dup_function_content.replace("\"", "'")).replace(word_x, + f'{word_x.strip()}') + # 保存每个维度对应的相似度到idc_project_check_detail + mysql.sql_change_msg( + """insert into idc_project_check_detail (dup_id, dimension, similarity, function_content, dup_function_content, create_time, update_time) value (%d, "%s", %f, "%s", "%s", "%s", "%s")""" + % (dup_id, wdys2.get(x), similarity, escape_string(function_content), + escape_string(dup_function_content), str(datetime.datetime.now())[:-7], + str(datetime.datetime.now())[:-7])) + else: + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keywords_x, keywords_y = similarity.main() + similarity = similarity * (60 / dup_count) + #print("**************相似度: %.2f%%" % similarity, "关键词: %s" % keywords_y) + # 相似度相加 + total_similarity += similarity + # 关键词收集 + total_keywords[x] = keywords_y + function_content = content_y + dup_function_content = content_x + + for word_y in keywords_y: + word_y = word_y.strip().strip("'").strip('"') + function_content = str(function_content.replace("\"", "'")).replace(word_y, + f'{word_y.strip()}') + for word_x in keywords_x: + word_x = word_x.strip().strip("'").strip('"') + dup_function_content = str(dup_function_content.replace("\"", "'")).replace(word_x, + f'{word_x.strip()}') + # 保存每个维度对应的相似度到idc_project_check_detail + mysql.sql_change_msg( + """insert into idc_project_check_detail (dup_id, dimension, similarity, function_content, dup_function_content, create_time, update_time) value (%d, "%s", %f, "%s", "%s", "%s", "%s")""" + % (dup_id, wdys2.get(x), similarity, escape_string(function_content), + escape_string(dup_function_content), str(datetime.datetime.now())[:-7], + str(datetime.datetime.now())[:-7])) + elif xc['jsnr'] == ' ' and str_dict['jsnr'] == ' ': + for x in list(xc.keys())[1:]: + content_x = xc.get(x) + content_y = str_dict.get(x) + if content_x and content_y: + if x == 'gnmk': + # 匹配到历史数据,次数加1 + # dup_count += dup_file_test + # 循环遍历每一个维度 + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keywords_x, keywords_y = similarity.main() + similarity = similarity * 50 + #print("**************相似度: %.2f%%" % similarity, "关键词: %s" % keywords_y) + # 相似度相加 + total_similarity += similarity + # 关键词收集 + total_keywords[x] = keywords_y + + function_content = content_y + dup_function_content = content_x + for word_y in keywords_y: + word_y = word_y.strip().strip("'").strip('"') + function_content = str(function_content.replace("\"", "'")).replace(word_y, + f'{word_y.strip()}') + for word_x in keywords_x: + word_x = word_x.strip().strip("'").strip('"') + dup_function_content = str(dup_function_content.replace("\"", "'")).replace(word_x, + f'{word_x.strip()}') + # 保存每个维度对应的相似度到idc_project_check_detail + mysql.sql_change_msg( + """insert into idc_project_check_detail (dup_id, dimension, similarity, function_content, dup_function_content, create_time, update_time) value (%d, "%s", %f, "%s", "%s", "%s", "%s")""" + % (dup_id, wdys2.get(x), similarity, escape_string(function_content), + escape_string(dup_function_content), str(datetime.datetime.now())[:-7], + str(datetime.datetime.now())[:-7])) + # content = content.replace(gjcs, f'{gjcs.strip()}') + elif x == 'jsnr': + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keywords_x, keywords_y = similarity.main() + similarity = similarity * 0 + #print("**************相似度: %.2f%%" % similarity, "关键词: %s" % keywords_y) + # 相似度相加 + total_similarity += similarity + # 关键词收集 + total_keywords[x] = keywords_y + function_content = content_y + dup_function_content = content_x + for word_y in keywords_y: + word_y = word_y.strip().strip("'").strip('"') + function_content = str(function_content.replace("\"", "'")).replace(word_y, + f'{word_y.strip()}') + for word_x in keywords_x: + word_x = word_x.strip().strip("'").strip('"') + dup_function_content = str(dup_function_content.replace("\"", "'")).replace(word_x, + f'{word_x.strip()}') + # 保存每个维度对应的相似度到idc_project_check_detail + mysql.sql_change_msg( + """insert into idc_project_check_detail (dup_id, dimension, similarity, function_content, dup_function_content, create_time, update_time) value (%d, "%s", %f, "%s", "%s", "%s", "%s")""" + % (dup_id, wdys2.get(x), similarity, escape_string(function_content), + escape_string(dup_function_content), str(datetime.datetime.now())[:-7], + str(datetime.datetime.now())[:-7])) + else: + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keywords_x, keywords_y = similarity.main() + similarity = similarity * (50 / dup_count) + #print("**************相似度: %.2f%%" % similarity, "关键词: %s" % keywords_y) + # 相似度相加 + total_similarity += similarity + # 关键词收集 + total_keywords[x] = keywords_y + function_content = content_y + dup_function_content = content_x + + for word_y in keywords_y: + word_y = word_y.strip().strip("'").strip('"') + function_content = str(function_content.replace("\"", "'")).replace(word_y, + f'{word_y.strip()}') + for word_x in keywords_x: + word_x = word_x.strip().strip("'").strip('"') + dup_function_content = str(dup_function_content.replace("\"", "'")).replace(word_x, + f'{word_x.strip()}') + # 保存每个维度对应的相似度到idc_project_check_detail + mysql.sql_change_msg( + """insert into idc_project_check_detail (dup_id, dimension, similarity, function_content, dup_function_content, create_time, update_time) value (%d, "%s", %f, "%s", "%s", "%s", "%s")""" + % (dup_id, wdys2.get(x), similarity, escape_string(function_content), + escape_string(dup_function_content), str(datetime.datetime.now())[:-7], + str(datetime.datetime.now())[:-7])) + else: + for x in list(xc.keys())[1:]: + content_x = xc.get(x) + content_y = str_dict.get(x) + if content_x and content_y: + if x == 'gnmk': + # 匹配到历史数据,次数加1 + # dup_count += dup_file_test + # 循环遍历每一个维度 + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keywords_x, keywords_y = similarity.main() + similarity = similarity * 50 + #print("**************相似度: %.2f%%" % similarity, "关键词: %s" % keywords_y) + # 相似度相加 + total_similarity += similarity + # 关键词收集 + total_keywords[x] = keywords_y + + function_content = content_y + dup_function_content = content_x + for word_y in keywords_y: + word_y = word_y.strip().strip("'").strip('"') + function_content = str(function_content.replace("\"", "'")).replace(word_y, + f'{word_y.strip()}') + for word_x in keywords_x: + word_x = word_x.strip().strip("'").strip('"') + dup_function_content = str(dup_function_content.replace("\"", "'")).replace(word_x, + f'{word_x.strip()}') + # 保存每个维度对应的相似度到idc_project_check_detail + mysql.sql_change_msg( + """insert into idc_project_check_detail (dup_id, dimension, similarity, function_content, dup_function_content, create_time, update_time) value (%d, "%s", %f, "%s", "%s", "%s", "%s")""" + % (dup_id, wdys2.get(x), similarity, escape_string(function_content), + escape_string(dup_function_content), str(datetime.datetime.now())[:-7], + str(datetime.datetime.now())[:-7])) + # content = content.replace(gjcs, f'{gjcs.strip()}') + elif x == 'jsnr': + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keywords_x, keywords_y = similarity.main() + similarity = similarity * 40 + #print("**************相似度: %.2f%%" % similarity, "关键词: %s" % keywords_y) + # 相似度相加 + total_similarity += similarity + # 关键词收集 + total_keywords[x] = keywords_y + function_content = content_y + dup_function_content = content_x + for word_y in keywords_y: + word_y = word_y.strip().strip("'").strip('"') + function_content = str(function_content.replace("\"", "'")).replace(word_y, + f'{word_y.strip()}') + for word_x in keywords_x: + word_x = word_x.strip().strip("'").strip('"') + dup_function_content = str(dup_function_content.replace("\"", "'")).replace(word_x, + f'{word_x.strip()}') + # 保存每个维度对应的相似度到idc_project_check_detail + mysql.sql_change_msg( + """insert into idc_project_check_detail (dup_id, dimension, similarity, function_content, dup_function_content, create_time, update_time) value (%d, "%s", %f, "%s", "%s", "%s", "%s")""" + % (dup_id, wdys2.get(x), similarity, escape_string(function_content), + escape_string(dup_function_content), str(datetime.datetime.now())[:-7], + str(datetime.datetime.now())[:-7])) + else: + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keywords_x, keywords_y = similarity.main() + similarity = similarity * (10 / dup_count) + #print("**************相似度: %.2f%%" % similarity, "关键词: %s" % keywords_y) + # 相似度相加 + total_similarity += similarity + # 关键词收集 + total_keywords[x] = keywords_y + function_content = content_y + dup_function_content = content_x + + for word_y in keywords_y: + word_y = word_y.strip().strip("'").strip('"') + function_content = str(function_content.replace("\"", "'")).replace(word_y, + f'{word_y.strip()}') + for word_x in keywords_x: + word_x = word_x.strip().strip("'").strip('"') + dup_function_content = str(dup_function_content.replace("\"", "'")).replace(word_x, + f'{word_x.strip()}') + # 保存每个维度对应的相似度到idc_project_check_detail + mysql.sql_change_msg( + """insert into idc_project_check_detail (dup_id, dimension, similarity, function_content, dup_function_content, create_time, update_time) value (%d, "%s", %f, "%s", "%s", "%s", "%s")""" + % (dup_id, wdys2.get(x), similarity, escape_string(function_content), + escape_string(dup_function_content), str(datetime.datetime.now())[:-7], + str(datetime.datetime.now())[:-7])) + + mysql.sql_change_msg( + """update idc_project_check set similarity=%f where dup_id=%d""" % (total_similarity, dup_id)) + project_gjc = {} + for w in wdys2.keys(): + content_x = str_dict.get(w) + content_y = str_dict.get(w) + if content_x and content_y: + # 循环遍历每一个维度 + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keywords_x, keywords = similarity.main() + project_gjc[w] = keywords + mysql.sql_change_msg( + """insert into user_keyword (xmmc, xzwt, xtjc, xmmb, yqjx, jsxq, sjxq, aqxq, ywly, hxyw, ywxq, ywxt, jscj, yhfw, mbqt, jsnr, gnmk, sjgx, znys) value ("%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s")""" + % (dl[0], str(project_gjc.get("xzwt"))[1:-1] if project_gjc.get("xzwt") else None, + str(project_gjc.get("xtjc"))[1:-1] if project_gjc.get("xtjc") else None, + str(project_gjc.get("xmmb"))[1:-1] if project_gjc.get("xmmb") else None, + str(project_gjc.get("yqjx"))[1:-1] if project_gjc.get("yqjx") else None, + str(project_gjc.get("jsxq"))[1:-1] if project_gjc.get("jsxq") else None, + str(project_gjc.get("sjxq"))[1:-1] if project_gjc.get("sjxq") else None, + str(project_gjc.get("aqxq"))[1:-1] if project_gjc.get("aqxq") else None, + str(project_gjc.get("ywly"))[1:-1] if project_gjc.get("ywly") else None, + str(project_gjc.get("hxyw"))[1:-1] if project_gjc.get("hxyw") else None, + str(project_gjc.get("ywxq"))[1:-1] if project_gjc.get("ywxq") else None, + str(project_gjc.get("ywxt"))[1:-1] if project_gjc.get("ywxt") else None, + str(project_gjc.get("jscj"))[1:-1] if project_gjc.get("jscj") else None, + str(project_gjc.get("yhfw"))[1:-1] if project_gjc.get("yhfw") else None, + str(project_gjc.get("mbqt"))[1:-1] if project_gjc.get("mbqt") else None, + str(project_gjc.get("jsnr"))[1:-1] if project_gjc.get("jsnr") else None, + str(project_gjc.get("gnmk"))[1:-1] if project_gjc.get("gnmk") else None, + str(project_gjc.get("sjgx"))[1:-1] if project_gjc.get("sjgx") else None, + str(project_gjc.get("znys"))[1:-1] if project_gjc.get("znys") else None)) + mysql.sql_change_msg( + """update idc_project set dup_status=3, one_vote_veto_status=dup_file_test, self_check_status=dup_file_test, history_project_count=%d ,module_count=%d where project_id=%d""" % ( + xmnr_count, gnmk_count, dl[0])) + gong_neng_mo_kuai(mysql, dl, data, er_title) + + +if __name__ == "__main__": + # all_path = requests.get("http://127.0.0.1:19099/check/duplicates/%s" % 15).json() + # print(all_path) + + # data_list = [] + # for ap in all_path.get("data"): + # # if os.path.exists(ap.get("file_path")): + # data_list.append((ap.get("project_id"), ap.get("file_path"), ap.get("project_name"))) + # print(data_list) + data_list = [(11, r"C:\Users\HUAWEI\PycharmProjects\nlp\dup_check\0825-丽水系统查重维度1.xlsx", "水路运输综合监管系统建设项目.xls")] + project_check(data_list) +""" + +""" diff --git a/main10.py b/main10.py new file mode 100644 index 0000000..e368dee --- /dev/null +++ b/main10.py @@ -0,0 +1,391 @@ +# coding=utf-8 +import sys +import re +import mysql_pool +from pymysql.converters import escape_string +import cosin_similarity +import pandas as pd +import datetime +import requests +import os + +wdys1 = { + "项目名称": "xmmc", + "现状问题": "xzwt", + "系统基础": "xtjc", + "项目目标": "xmmb", + "预期绩效": "yqjx", + "建设需求": "jsxq", + "数据需求": "sjxq", + "安全需求": "aqxq", + "业务领域": "ywly", + "核心业务": "hxyw", + "业务需求": "ywxq", + "业务协同": "ywxt", + "建设层级": "jscj", + "用户范围": "yhfw", + "目标群体": "mbqt", + "建设内容": "jsnr", + "功能模块": "gnmk", + "数据共享": "sjgx", + "智能要素": "znys" +} +wdys2 = { + "xmmc": "项目名称", + "xzwt": "现状问题", + "xtjc": "系统基础", + "xmmb": "项目目标", + "yqjx": "预期绩效", + "jsxq": "建设需求", + "sjxq": "数据需求", + "aqxq": "安全需求", + "ywly": "业务领域", + "hxyw": "核心业务", + "ywxq": "业务需求", + "ywxt": "业务协同", + "jscj": "建设层级", + "yhfw": "用户范围", + "mbqt": "目标群体", + "jsnr": "建设内容", + "gnmk": "功能模块", + "sjgx": "数据共享", + "znys": "智能要素" +} +gnmkys = { + "gnmc": "功能名称", + "gnms": "功能描述" +} + + +def getFlag(): + data_dict = {} + df = pd.read_excel("0825-丽水系统查重维度.xlsx") + data = df.values + data = list(pd.Series(data[:, 1]).dropna()) + for d in data: + try: + wd = re.search("(.*?)(.*?%)", d).group(1).strip() + wdc = wdys1.get(wd) + if wdc: + qz = re.search(".*?((.*?%))", d).group(1) + data_dict[wdc] = qz + except: + pass + return data_dict + + +def gong_neng_mo_kuai(mysql, dl, data, er_title): + # 将excel文件中的所有第三维度内容进行拼接 + str_dict = {} + for et in er_title: + for d in data: + if d[1] == et: + if str_dict.get(et): + str_dict[et] = str_dict.get(et) + d[3] + else: + str_dict[et] = d[3] + # print(str_dict) + for k, v in str_dict.items(): + mysql.sql_change_msg( + """insert into idc_project_module (project_id, check_duplicate_count, module_name, module_content, create_time, update_time, tag) value(%d, 1, "%s", "%s", "%s", "%s", "模块")""" % ( + int(dl[0]), k, v, str(datetime.datetime.now())[:-7], str(datetime.datetime.now())[:-7])) + module_id_list = mysql.sql_select_many( + """select project_module_id, module_name, module_content from idc_project_module where project_id=%d""" % dl[ + 0]) + data_list = [] + for mil in module_id_list: + data_dict = {} + data_dict["project_module_id"] = mil.get("project_module_id") + data_dict["gnmc"] = mil.get("module_name") + data_dict["gnms"] = mil.get("module_content") + data_list.append(data_dict) + # print(data_list) + for i in data_list: + gnmk_copy1 = mysql.sql_select_many("""select * from user_history_module_data""") + if gnmk_copy1: + for gc in gnmk_copy1: + total_similarity1 = 0 + total_keywords1 = [] + total_similarity2 = 0 + total_keywords2 = [] + mysql.sql_change_msg( + """insert into idc_project_module_check (project_module_id, module_name, project_name, company_name, create_time, update_time) value(%d, "%s", "%s", "%s", "%s", "%s")""" + % ( + i.get("project_module_id"), gc.get("gnmc"), gc.get("xmmc"), "", + str(datetime.datetime.now())[:-7], + str(datetime.datetime.now())[:-7])) + dup_module_id = mysql.cur.lastrowid + for j in ["gnmc", "gnms"]: + # 循环遍历每一个模块名称 + content_x = gc.get(j) + content_y = i.get(j) + if content_x and content_y: + if j == "gnmc": + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keyword_x, keywords = similarity.main() + similarity = similarity * 1 + total_keywords1 += keywords + print("######################相似度: %.2f%%" % similarity, "关键词: %s" % keywords) + # 相似度相加 + total_similarity1 += similarity + mysql.sql_change_msg( + """insert into idc_project_module_check_detail (dup_module_id, project_name, module_content, dup_module_content, similarity, dimension, create_time, update_time) value (%d, "%s", "%s", "%s", %f, "%s", "%s", "%s")""" + % (dup_module_id, dl[2], escape_string(content_y), escape_string(content_x), similarity, + "功能名称", + str(datetime.datetime.now())[:-7], str(datetime.datetime.now())[:-7])) + else: + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keyword_x, keywords = similarity.main() + similarity = similarity * 99 + total_keywords2 += keywords + print("######################相似度: %.2f%%" % similarity, "关键词: %s" % keywords) + # 相似度相加 + total_similarity2 += similarity + mysql.sql_change_msg( + """insert into idc_project_module_check_detail (dup_module_id, project_name, module_content, dup_module_content, similarity, dimension, create_time, update_time) value (%d, "%s", "%s", "%s", %f, "%s", "%s", "%s")""" + % (dup_module_id, dl[2], escape_string(content_y), escape_string(content_x), similarity, + "功能模块描述", + str(datetime.datetime.now())[:-7], str(datetime.datetime.now())[:-7])) + mysql.sql_change_msg("""update idc_project_module_check set similarity=%f where dup_module_id=%d""" % ( + total_similarity1 + total_similarity2, dup_module_id)) + gnmk_gjc = {} + for a in ["gnmc", "gnms"]: + if i.get(a): + content_x = i.get(a) + content_y = i.get(a) + if a == "gnmc": + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keyword_x, keywords = similarity.main() + gnmk_gjc[a] = keywords + else: + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keyword_x, keywords = similarity.main() + gnmk_gjc[a] = keywords + mysql.sql_change_msg("""insert into user_module_keywords (xmmc, gnmc, gnms) value("%s", "%s", "%s")""" % ( + dl[2], str(gnmk_gjc.get("gnmc"))[1:-1] if gnmk_gjc.get("gnmc") else None, + str(gnmk_gjc.get("gnms"))[1:-1] if gnmk_gjc.get("gnms") else None)) + + +def project_check(data_list): + mysql = mysql_pool.ConnMysql() + # mysql.sql_select_many("""select * from mkgjc""") + # 读取维度和权重 + # xmnr_count = len(mysql.sql_select_many("""select * from xmnr_copy1""")) + # gnmk_count = len(mysql.sql_select_many("""select * from gnmk_copy1""")) + xmnr_count = len(mysql.sql_select_many("""select * from user_history_data""")) + gnmk_count = len(mysql.sql_select_many("""select * from user_history_module_data""")) + get_data_dict = getFlag() + # 遍历excel存储路径 + for dl in data_list: + # path = "0825-丽水系统查重维度1.xlsx" + # 读取路径下的excel + df = pd.read_excel(dl[1]) + data = df.values + # 将excel文件中的所有维度内容进行拼接 + join_str = "" + str_dict = {} + title = "" + er_title = set() + for d in data: + if pd.notnull(d[0]): + title = d[0] + if title == "功能模块": + er_title.add(d[1]) + join_str = "" + for i in d[1:]: + if pd.notnull(i): + join_str +=i + str_dict[wdys1.get(title)] = join_str + else: + if title == "功能模块": + er_title.add(d[1]) + for i in d[1:]: + if pd.notnull(i): + join_str +=i + str_dict[wdys1.get(title)] = str_dict.get(wdys1.get(title)) + join_str + # print(str_dict) + mysql.sql_change_msg( + """insert into user_data (xmmc, xzwt, xtjc, xmmb, yqjx, jsxq, sjxq, aqxq, ywly, hxyw, ywxq, ywxt, jscj, yhfw, mbqt, jsnr, gnmk, sjgx, znys) value ("%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s")""" + % (dl[0], str_dict.get("xzwt") if str_dict.get("xzwt") else None, + str_dict.get("xtjc") if str_dict.get("xtjc") else None, + str_dict.get("xmmb") if str_dict.get("xmmb") else None, + str_dict.get("yqjx") if str_dict.get("yqjx") else None, + str_dict.get("jsxq") if str_dict.get("jsxq") else None, + str_dict.get("sjxq") if str_dict.get("sjxq") else None, + str_dict.get("aqxq") if str_dict.get("aqxq") else None, + str_dict.get("ywly") if str_dict.get("ywly") else None, + str_dict.get("hxyw") if str_dict.get("hxyw") else None, + str_dict.get("ywxq") if str_dict.get("ywxq") else None, + str_dict.get("ywxt") if str_dict.get("ywxt") else None, + str_dict.get("jscj") if str_dict.get("jscj") else None, + str_dict.get("yhfw") if str_dict.get("yhfw") else None, + str_dict.get("mbqt") if str_dict.get("mbqt") else None, + str_dict.get("jsnr") if str_dict.get("jsnr") else None, + str_dict.get("gnmk") if str_dict.get("gnmk") else None, + str_dict.get("sjgx") if str_dict.get("sjgx") else None, + str_dict.get("znys") if str_dict.get("znys") else None)) + # 或取所有的xmnr_copy1 + xmnr_copy1 = mysql.sql_select_many("""select * from user_history_data""") + # 对比xmnr_copy1和xmnr维度是否都有 + if xmnr_copy1: + for xc in xmnr_copy1: + total_keywords = {} + total_similarity = 0 + dup_count = 0 + # 保存相加后的相似度到idc_project_check + mysql.sql_change_msg( + """insert into idc_project_check (project_id, dup_project_name, file_path, company_name, create_year, project_tag, project_range_tag, project_area, create_time, update_time) value ("%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s")""" + % (dl[0], xc.get("xmmc"), dl[1], "", "", "需求相似、业务相似", "历史项目", "", + str(datetime.datetime.now())[:-7], str(datetime.datetime.now())[:-7])) + dup_id = mysql.cur.lastrowid + for x in list(xc.keys())[1:]: + content_x = xc.get(x) + content_y = str_dict.get(x) + if content_x and content_y: + if x == 'gnmk': + continue + elif x == 'jsnr': + continue + else: + dup_count += 1 + for x in list(xc.keys())[1:]: + content_x = xc.get(x) + content_y = str_dict.get(x) + if content_x and content_y: + if x == 'gnmk': + # 匹配到历史数据,次数加1 + # dup_count += 1 + # 循环遍历每一个维度 + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keywords_x, keywords_y = similarity.main() + similarity = similarity * 50 + print("**************相似度: %.2f%%" % similarity, "关键词: %s" % keywords_y) + # 相似度相加 + total_similarity += similarity + # 关键词收集 + total_keywords[x] = keywords_y + + function_content = content_y + dup_function_content = content_x + for word_y in keywords_y: + word_y = word_y.strip().strip("'").strip('"') + function_content = str(function_content.replace("\"", "'")).replace(word_y, + f'{word_y.strip()}') + for word_x in keywords_x: + word_x = word_x.strip().strip("'").strip('"') + dup_function_content = str(dup_function_content.replace("\"", "'")).replace(word_x, + f'{word_x.strip()}') + # 保存每个维度对应的相似度到idc_project_check_detail + mysql.sql_change_msg( + """insert into idc_project_check_detail (dup_id, dimension, similarity, function_content, dup_function_content, create_time, update_time) value (%d, "%s", %f, "%s", "%s", "%s", "%s")""" + % (dup_id, wdys2.get(x), similarity, escape_string(function_content), + escape_string(dup_function_content), str(datetime.datetime.now())[:-7], + str(datetime.datetime.now())[:-7])) + # content = content.replace(gjcs, f'{gjcs.strip()}') + elif x == 'jsnr': + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keywords_x, keywords_y = similarity.main() + similarity = similarity * 40 + print("**************相似度: %.2f%%" % similarity, "关键词: %s" % keywords_y) + # 相似度相加 + total_similarity += similarity + # 关键词收集 + total_keywords[x] = keywords_y + function_content = content_y + dup_function_content = content_x + for word_y in keywords_y: + word_y = word_y.strip().strip("'").strip('"') + function_content = str(function_content.replace("\"", "'")).replace(word_y, + f'{word_y.strip()}') + for word_x in keywords_x: + word_x = word_x.strip().strip("'").strip('"') + dup_function_content = str(dup_function_content.replace("\"", "'")).replace(word_x, + f'{word_x.strip()}') + # 保存每个维度对应的相似度到idc_project_check_detail + mysql.sql_change_msg( + """insert into idc_project_check_detail (dup_id, dimension, similarity, function_content, dup_function_content, create_time, update_time) value (%d, "%s", %f, "%s", "%s", "%s", "%s")""" + % (dup_id, wdys2.get(x), similarity, escape_string(function_content), + escape_string(dup_function_content), str(datetime.datetime.now())[:-7], + str(datetime.datetime.now())[:-7])) + else: + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keywords_x, keywords_y = similarity.main() + similarity = similarity * (10 / dup_count) + print("**************相似度: %.2f%%" % similarity, "关键词: %s" % keywords_y) + # 相似度相加 + total_similarity += similarity + # 关键词收集 + total_keywords[x] = keywords_y + function_content = content_y + dup_function_content = content_x + for word_y in keywords_y: + word_y = word_y.strip().strip("'").strip('"') + function_content = str(function_content.replace("\"", "'")).replace(word_y, + f'{word_y.strip()}') + for word_x in keywords_x: + word_x = word_x.strip().strip("'").strip('"') + dup_function_content = str(dup_function_content.replace("\"", "'")).replace(word_x, + f'{word_x.strip()}') + # 保存每个维度对应的相似度到idc_project_check_detail + mysql.sql_change_msg( + """insert into idc_project_check_detail (dup_id, dimension, similarity, function_content, dup_function_content, create_time, update_time) value (%d, "%s", %f, "%s", "%s", "%s", "%s")""" + % (dup_id, wdys2.get(x), similarity, escape_string(function_content), + escape_string(dup_function_content), str(datetime.datetime.now())[:-7], + str(datetime.datetime.now())[:-7])) + + mysql.sql_change_msg( + """update idc_project_check set similarity=%f where dup_id=%d""" % (total_similarity, dup_id)) + project_gjc = {} + for w in wdys2.keys(): + content_x = str_dict.get(w) + content_y = str_dict.get(w) + if content_x and content_y: + # 循环遍历每一个维度 + similarity = cosin_similarity.CosineSimilarity(content_x, content_y) + # 相似度 关键词 + similarity, keywords_x, keywords = similarity.main() + project_gjc[w] = keywords + mysql.sql_change_msg( + """insert into user_keyword (xmmc, xzwt, xtjc, xmmb, yqjx, jsxq, sjxq, aqxq, ywly, hxyw, ywxq, ywxt, jscj, yhfw, mbqt, jsnr, gnmk, sjgx, znys) value ("%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s")""" + % (dl[0], str(project_gjc.get("xzwt"))[1:-1] if project_gjc.get("xzwt") else None, + str(project_gjc.get("xtjc"))[1:-1] if project_gjc.get("xtjc") else None, + str(project_gjc.get("xmmb"))[1:-1] if project_gjc.get("xmmb") else None, + str(project_gjc.get("yqjx"))[1:-1] if project_gjc.get("yqjx") else None, + str(project_gjc.get("jsxq"))[1:-1] if project_gjc.get("jsxq") else None, + str(project_gjc.get("sjxq"))[1:-1] if project_gjc.get("sjxq") else None, + str(project_gjc.get("aqxq"))[1:-1] if project_gjc.get("aqxq") else None, + str(project_gjc.get("ywly"))[1:-1] if project_gjc.get("ywly") else None, + str(project_gjc.get("hxyw"))[1:-1] if project_gjc.get("hxyw") else None, + str(project_gjc.get("ywxq"))[1:-1] if project_gjc.get("ywxq") else None, + str(project_gjc.get("ywxt"))[1:-1] if project_gjc.get("ywxt") else None, + str(project_gjc.get("jscj"))[1:-1] if project_gjc.get("jscj") else None, + str(project_gjc.get("yhfw"))[1:-1] if project_gjc.get("yhfw") else None, + str(project_gjc.get("mbqt"))[1:-1] if project_gjc.get("mbqt") else None, + str(project_gjc.get("jsnr"))[1:-1] if project_gjc.get("jsnr") else None, + str(project_gjc.get("gnmk"))[1:-1] if project_gjc.get("gnmk") else None, + str(project_gjc.get("sjgx"))[1:-1] if project_gjc.get("sjgx") else None, + str(project_gjc.get("znys"))[1:-1] if project_gjc.get("znys") else None)) + mysql.sql_change_msg( + """update idc_project set dup_status=3, one_vote_veto_status=1, self_check_status=1, history_project_count=%d ,module_count=%d where project_id=%d""" % ( + xmnr_count, gnmk_count, dl[0])) + gong_neng_mo_kuai(mysql, dl, data, er_title) + + +if __name__ == "__main__": + all_path = requests.get("http://127.0.0.1:19099/check/duplicates/%s" % 15).json() + # print(all_path) + # + # data_list = [] + # for ap in all_path.get("data"): + # # if os.path.exists(ap.get("file_path")): + # data_list.append((ap.get("project_id"), ap.get("file_path"), ap.get("project_name"))) + # print(data_list) + # data_list = [(11, r"D:\pythonDM\Ndkj\duplicate_check\0825-丽水系统查重维度1.xlsx", "数字百山祖(一期)—“云值守”建设方案")] + # project_check(data_list) diff --git a/mysql_pool.py b/mysql_pool.py new file mode 100644 index 0000000..b09b6ed --- /dev/null +++ b/mysql_pool.py @@ -0,0 +1,113 @@ +# coding=utf-8 +import pymysql +from dbutils.pooled_db import PooledDB +# from dbutils.persistent_db import PersistentDB + +mysqlInfo = { + "host": '47.98.125.47', + "user": 'root', + "passwd": 'NingdaKeji123!', + "db": 'idc', + "port": 3306, + "charset": "utf8" +} + + +class ConnMysql(object): + __pool = None + + def __init__(self): + # 构造函数,创建数据库连接、游标 + self.coon = ConnMysql._get_mysql_conn() + self.cur = self.coon.cursor(cursor=pymysql.cursors.DictCursor) + + # 数据库连接池连接 + @staticmethod + def _get_mysql_conn(): + global __pool + if ConnMysql.__pool is None: + __pool = PooledDB( + creator=pymysql, + mincached=1, + maxcached=5, + maxconnections=6, + maxshared=3, + blocking=True, + maxusage=None, + setsession=[], + ping=2, + host=mysqlInfo['host'], + user=mysqlInfo['user'], + passwd=mysqlInfo['passwd'], + db=mysqlInfo['db'], + port=mysqlInfo['port'], + charset=mysqlInfo['charset']) + return __pool.connection() + + # 插入、修改、删除一条 + def sql_change_msg(self, sql): + change_sql = self.cur.execute(sql) + self.coon.commit() + return change_sql + + # 查询一条 + def sql_select_one(self, sql): + self.cur.execute(sql) + select_res = self.cur.fetchone() + return select_res + + # 查询多条 + def sql_select_many(self, sql, count=None): + self.cur.execute(sql) + if count is None: + select_res = self.cur.fetchall() + else: + select_res = self.cur.fetchmany(count) + return select_res + + # 释放资源 + def release(self): + self.coon.close() + self.cur.close() + + +if __name__ == '__main__': + [{'Tables_in_idc': 'gjc'}, + {'Tables_in_idc': 'gjc2'}, + {'Tables_in_idc': 'idc_dept'}, + {'Tables_in_idc': 'idc_project'}, {'Tables_in_idc': 'idc_project_check'}, + {'Tables_in_idc': 'idc_project_check_detail'}, {'Tables_in_idc': 'idc_project_module'}, + {'Tables_in_idc': 'idc_project_module_check'}, {'Tables_in_idc': 'idc_project_module_check_detail'}, + {'Tables_in_idc': 'idc_user'}, {'Tables_in_idc': 'idc_user_dept'}, {'Tables_in_idc': 'mk2'}] + + # print(ConnMysql().sql_select_many("show tables;")) + mysql = ConnMysql() + # mysql.sql_change_msg("""insert into idc_project (project_name,file_path) value ("%s", "%s")""" % ("森林火险", "/opt/idc/file/20220924/79a53829-8965-4aof-a342-c532f6c9c2a3森林火险.xlsx")) + # print(mysql.sql_select_many("""select * from gjc""")) + # print(mysql.sql_select_many("""select * from gjc2 where id=dup_file_test""")) + # print(mysql.sql_select_many("""select * from xmnr""")) + # print(mysql.sql_select_many("""select * from gjc_copy1""")) + # print(mysql.sql_select_one("""select * from idc_project_check""")) + # print(mysql.sql_select_one("""select * from idc_project_check_detail""")) + # print(mysql.sql_select_many("""select * from idc_project_module""")) + # print(mysql.sql_select_many("""select * from idc_project_module where project_id=%d""" % int(7))) + # print( mysql.sql_select_one("""select dup_id from idc_project_check where project_id=%d"""% int(7))) + # print(len(mysql.sql_select_many("""select * from xmnr_copy1"""))) + # print(len(mysql.sql_select_many("""select * from user_history_data"""))) + print(len(mysql.sql_select_many("""select * from user_history_data"""))) + + """查重复select * from user_history_module_data where gnms in (select gnms from user_history_module_data group by gnms having count(gnms)>1); +""" + # print() + # str_dict={} + # cmnr_count=551 + # gnmkcount=1192 + # + # print(mysql.sql_change_msg( + # """update idc_project set company_name=%s, dup_status=3, one_vote_veto_status=dup_file_test, self_check_status=dup_file_test, history_project_count=%d ,module_count=%d where project_id=%d""" % ( + # str_dict.get('sbdw'), xmnr_count=551, gnmk_count=1192, 104))) + # print(mysql.sql_change_msg( + # """update idc_project set dup_status=3, one_vote_veto_status=dup_file_test, self_check_status=dup_file_test, history_project_count=%d ,module_count=%d where project_id=%d""" % ( + # ) + # for k, v in mysql.sql_select_one("""select * from idc_project_check_detail""").items(): + # print(k, v) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..bea2beb --- /dev/null +++ b/requirements.txt @@ -0,0 +1,41 @@ +certifi==2022.6.15 +cffi==1.15.1 +chardet==5.0.0 +charset-normalizer==2.0.12 +click==8.0.4 +colorama==0.4.5 +cryptography==3.4.7 +dataclasses==0.8 +DBUtils==3.0.2 +et-xmlfile==1.1.0 +Flask==1.0.2 +idna==3.3 +importlib-metadata==4.8.3 +itsdangerous==2.0.1 +jieba==0.42.1 +Jinja2==3.0.3 +joblib==1.1.0 +MarkupSafe==2.0.1 +numpy==1.19.5 +openpyxl==3.0.10 +pandas==1.1.5 +pdfminer.six==20211012 +pdfplumber==0.6.0 +Pillow==8.4.0 +pycparser==2.21 +PyMySQL==0.10.1 +pypiwin32==223 +python-dateutil==2.8.2 +pytz==2022.2.1 +pywin32==304 +requests==2.27.1 +scikit-learn==0.24.2 +scipy==1.5.4 +six==1.16.0 +threadpoolctl==3.1.0 +typing_extensions==4.1.1 +urllib3==1.26.12 +Wand==0.6.10 +Werkzeug==2.0.3 +xlrd==1.2.0 +zipp==3.6.0 diff --git a/水路运输综合监管系统建设项目.xls b/水路运输综合监管系统建设项目.xls new file mode 100644 index 0000000000000000000000000000000000000000..c3481caef80401763a0ab0ea682a04a2e34029fb GIT binary patch literal 78336 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�CVgShG*X?-Wn(4!DEg3NWb_#-$bw- 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