之前modelscope搞活动的时候,上网页对这里面的模型有了了解,但好奇为主,使用嘛,当时确实没有使用场景。
modelscope网址:https://modelscope.cn/models
里面有各种比较常见的模型,最近项目组来了活,有一堆不同业务域的表,需要我们按照表的字段内容将表分到不同的属性域中,说简单点就是把可以用的表unionall起来,听起来很简单,就拿优惠券发送表来说,八十个字段的模版表,有八个来源表,每个来源表假如是五十个字段,需要的工作量多大,就不称述了。
所以我就琢磨着用模型中的一个模型来匹配注释,本来想用句子相似度的模型,但考虑到时间问题和入参仅为两个,选为语义相关性的模型。
实际效果很一般,因为在通用领域使用的模型,在垂直领域的效果不尽如人意,但是他确实帮我筛掉了大部分不需要关注的字段。
代码从上往下,咋们首先要给自己的电脑安装需要的依赖。
- pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple "modelscope[nlp]" -f https://modelscope.oss-cn-beijing.aliyuncs.com/releases/repo.html
- pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade tensorflow
这是我最后导入依赖的模版,然后我们需要有两个文件,一个文件是我们的模版sql,一个是我们所有表的select语句,需要注意我定的sql模版必须是字段名+逗号+--+字段注释的样子。
然后我们写一个方法,清理掉sql中的select或者SELECT字符。
然后我会将一个表的字段名称和字段注释打成一个数组,并且会将表的表名给写入到一个单独的数组中,为了不将模版的表名也添加进去,所以可以用带test字符的表名。
下一步,我会将列名作为dic的key,列注释作为dic的键,只是这个办法着实有点笨,本来应该是判断是否包含中文等方式来判断,但是为了简单,我直接按步数判断,这也就要求待处理的sql中,每一个sql列都需要有注释。
此外,为了在写入的时候,用value获得对象的key,需要额外写个方法,这是为了写新的select语句的时候不至于拿不到字段名,好吧,我又用了一个麻烦的办法,我道歉,但我不想改,毕竟我自己用,比之前快几倍就够了。
然后是一段又臭又长,我还将用的模型和逻辑放一块的烂代码,它还会创建两个文件,一个是新的sql,也就是tmp数据的文件,一个是log的文件,里面是每一个表的字段和字段注释,表名,每一个字段和模版字段的相似度值是多少。
# 字段注释和分数的日志文件f=open("/Users/mac/vscode/log.txt", "a") t=open("/Users/mac/vscode/tmp数据.sql", "a") model_id='damo/nlp_rom_passage-ranking_chinese-base'model=Model.from_pretrained(model_id) tokenizer=PassageRankingPreprocessor(model.model_dir) pipeline_ins=pipeline(task=Tasks.passage_ranking, model=model, preprocessor=tokenizer) mb_list=get_new_array(read_sql(mb_path)[0]) drity_all_list=read_sql(dri_path) # print(drity_all_list)print("开始执行") foriinrange(len(drity_all_list)): end_result="select "drity_list=get_new_array(drity_all_list[i]) f.write(str(get_new_array(drity_all_list[i]))+"\n") f.write(str(table_name[i])+"\n") sentences_to_compare=list() mode_list= [] source_sentenc=""# 获得表中所有字段forold_k, old_vindrity_list.items(): sentences_to_compare.append(old_v) # 按照模版表获得语义相近的字段,语义相似度从0-1formb_k, mb_vinmb_list.items(): inputs= { 'source_sentence': [mb_v], 'sentences_to_compare': sentences_to_compare } f.write(str(mb_v)+"\n") # print(mb_v)result_mobel=pipeline_ins(input=inputs) mode_list=result_mobel['scores'] zip_dic=dict(zip(sentences_to_compare, mode_list)) # 对分数和注释名称打包的字典值按照分数进行倒排vi1_list=sorted(zip_dic.items(), key=itemgetter(1), reverse=True) f.write(str(vi1_list)+"\n") dic_v=str(list(vi1_list[0])[0]) dic_k=str(getDictKey_1(drity_list, dic_v)[0]) mb_k=str(getDictKey_1(mb_list, str(mb_v))[0]) # 比0.5小的默认为无意义数据iflist(vi1_list[0])[1] >0.5: # 移除已经匹配的模板字段iflist(vi1_list[0])[1] >0.8: sentences_to_compare.remove(dic_v) end_result=end_result+ \ "CAST("+dic_k+" AS STRING) AS "+str(mb_k) + \ ",--"+str(mb_v)+"->"+dic_v+"\n"else: end_result=end_result+ \ "CAST(null AS STRING) AS "+str(mb_k)+" ,--—"+str(mb_v) + \ "-->"+str(vi1_list[0][0])+"\n"t.write(end_result+"from "+table_name[i]+"\n union all \n") print("完成度"+("###"*i)+str(i/len(drity_all_list)*100)) f.flush() t.flush() f.close() t.close()