/MultiBert_NLP

Use different bert NLP

Primary LanguagePython

## NLP_sim

- 中文文本语义相似度计算模块。计算得到两个文本的相似度,并最终计算该feature与所有scenario的相似度,并结合人工检验方法构建的多路召回与多路输出,筛选与该feature语义接近的所有scenario。
- 借助Sentence Transformers与Pytorch构建。使用过程首先通过具体案例数据对已经完成预训练的模型进行微调,之后使用微调后模型进行语义量化特征计算与相似度(贡献度)计算。采用的预训练模型均为Bert类模型,包括bert-base-chinese、all-MiniLM-L6-v2、ms-marco-MiniLM-L-6-v2、multi-qa-MiniLM-L6-cos-v1、paraphrase-MiniLM-L6-v2,最终选择在案例词库上性能最佳的模型作为预训练模型应用。已经完成预训练的上述模型均来自hugging face的开源模型库。主要功能包括:文本词嵌入向量计算功能、词嵌入向量相似性(贡献度)分析功能、基于相似度的两组文本之间贡献度矩阵计算功能、语言模型微调功能、语言模型预训练功能。每个部分通过相应Python方法接口设计实现。

## 环境依赖
模块通过Python编写,Python版本推荐为3.7.9。具体使用的相关package信息详见requirement.txt。
numpy==1.26.3
pandas==2.1.4
sentence_transformers==2.2.2
torch==2.1.2
torch_xla==2.1.0
tqdm==4.66.1
transformers==4.36.2

## 文件描述
- config.py	//模型构建参数
- NLP_model.py	//模型类与多路召回人工检验功能
- utl.py	//使用工具
- requirements.txt	//安装package
- demo.ipynb	//应用案例
- data	//相关人工检验、微调、预训练数据
	-- Dataset	//补充收集的预训练使用数据,原始数据
	-- pretrain_testdata2.csv	//补充收集的预训练使用测试集
	-- pretrain_testdata.csv		//补充收集的预训练使用测试集
	-- pretrain_traindata.csv	//补充收集的预训练使用训练集
	-- pretrain_traindata2.csv	//补充收集的预训练使用训练集
	-- Book2.xlsx		//大众提供feature与scenario数据
	-- S_data.xlsx		//大众提供整理的scenario数据,作为测试集
	-- s2f_v2.xlsx		//大众提供feature与scenario数据,作为训练集和人工检验参考数据
- finetune_model	//保存微调后的模型文件夹
	-- all-MiniLM-L6-v2	//模型all-MiniLM-L6-v2
	-- bert-base-chinese	//新增模型bert-base-chinese
	-- ms-marco-MiniLM-L-6-v2	//模型ms-marco-MiniLM-L-6-v2
	-- multi-qa-MiniLM-L6-cos-v1	//模型multi-qa-MiniLM-L6-cos-v1
	-- paraphrase-MiniLM-L6-v2	//模型paraphrase-MiniLM-L6-v2
- pretrain_model	//保存下载的已经经过预训练的开源模型
	-- all-MiniLM-L6-v2	//模型all-MiniLM-L6-v2
	-- bert-base-chinese	//新增模型bert-base-chinese
	-- ms-marco-MiniLM-L-6-v2	//模型ms-marco-MiniLM-L-6-v2
	-- multi-qa-MiniLM-L6-cos-v1	//模型multi-qa-MiniLM-L6-cos-v1
	-- paraphrase-MiniLM-L6-v2	//模型paraphrase-MiniLM-L6-v2
- Results	//保存模型计算结果文件夹

## 模型相关
- bert预训练模型放在 pretain_model目录下,均为hugging face上提供的开源模型,且已经过预训练。
- 预训练模型下载地址:  
all-MiniLM-L6-v2: https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2
bert-base-chinese: https://huggingface.co/bert-base-chinese
ms-marco-MiniLM-L-6-v2: https://huggingface.co/cross-encoder/ms-marco-MiniLM-L-6-v2
multi-qa-MiniLM-L6-cos-v1: https://huggingface.co/sentence-transformers/multi-qa-MiniLM-L6-cos-v1
paraphrase-MiniLM-L6-v2: https://huggingface.co/sentence-transformers/paraphrase-MiniLM-L6-v2

- 模型均经过微调数据微调,微调后模型放在finetune_model目录下的同名文件
- 下载后,放在对应目录下,文件名称确认无误即可。  


## 接口与类描述
- class config: 
模型构建参数,调用方法如下ct = config.config(finetuneFile='./finetune_model/',  #微调模型保存路径
                    pretrainFile = './pretrain_model/', #预训练模型保存路径
                    resultsFile = './Results/', #结果保存路径
                    initial = True, #用于选取读取预训练模型还是微调模型,False为读取微调模型
                    model_name = model_name, #选取模型名字,目前准备模型有如上注释
                    max_expand = 1.5, #人工检验中用于扩大人工选择匹配文本对相似度的扩大倍数,该功能暂时禁用,因此采用默认值输入
                    ref_data = ref_data)

- class pretrain_config:
预训练过程使用参数,调用方法如下pre_ct = config.pretrain_config(per_device_train_batch_size=64,  #batch_size
                    save_steps = 1, #Save model every given steps
                    num_train_epochs = 1, #Number of epochs
                    use_fp16 = False, #Set to True, if your GPU supports FP16 operations
                    max_length = 512, #Max length for a text input
                    do_whole_word_mask = True, #If set to true, whole words are masked
                    mlm_prob = 0.15 #Probability that a word is replaced by a [MASK] token)

- utl.py:模型调用相关方法
	-- utl.shuffle(Scenario,S_data): 
用于构建负样本数据的打乱数据步骤,找现有feature不对应的scenario构建新的数据对,直接作为负样本,因此仅替换scenario对应关系,S_data:所有的scenario;Scenario:需要打乱顺序的scenario数据

	-- utl.combine_traindata(Feature,shuffle_Feature,Scenario,shuffle_Scenario,ref_data): 
构建微调的训练数据

	-- utl.combine_evaldata(Feature,shuffle_Feature,Scenario,shuffle_Scenario,ref_data): 
构建微调的验证数据

	-- utl.training_data_SF(Feature_list,Scenario_list,Feature_eval,Scenario_eval,ref_data): 
本函数调用shuffle、combine_traindata、combine_evaldata用于准备微调所需要的数据,train and eval use different data。

	-- utl.data_check(F_data,S_data,dic): 检验数据中的异常字符并做处理

-NLP_sim:NLP模型类与多路召回功能,用于构建模型,初始化方法如下:Bert_model = NLP_model.NLP_sim(ct) #ct为设定的config
	-- NLP_sim._Get_selected_Scenario_(sim,F_data,S_data): 
模型输出中使用的人工检查多路召回功能,4个之一。使用模型计算的sim获取相似度最高的10个scenario,根据计算的相似度排序,保存所有scenario中前10个

	-- NLP_sim._Get_searched_Scenario_(F_data,ref_data): 
模型输出中使用的人工检查多路召回功能,4个之一。使用参考数据获取scenario,在给定ref_data中找到feature,并将数据中对应scenario返回保存

	-- NLP_sim._Get_matched_Scenario_(F_data,ref_data): 
模型输出中使用的人工检查多路召回功能,4个之一。统计与feature中含有相同文字的scenario,给定feature,将与feature中有相同文字的scenario返回保存,SS_data为所有的scenario保存的列表

	-- NLP_sim._Get_BM25_Scenario(k1,k2,b,F_data,SS_data): 
模型输出中使用的人工检查多路召回功能,4个之一。利用BM2.5模型筛选scenario,作为NLP模型辅助结果,参考https://zhuanlan.zhihu.com/p/79202151。给定feature,通过BM2.5将scenario中与feature相近的词语返回保存,每个f的每个词都可以对s统计一个词频,因此一个f含有多个词频,最终取词频最高的s作为输出。由于S作为文档太短,会出现dft为0的情况,因此对W做了修正,改为dft+1。SS_data为所有的scenario保存列表,k1 k2取1.2~2,b取值0.75,参考:https://zhuanlan.zhihu.com/p/79202151。

	-- NLP_sim._GetEmbedding_(words): 
计算文本的embedding

	-- NLP_sim._GetSim_cos_(em1,em2): 
计算两个embedding的相似度

	-- NLP_sim._finetune_eval_(model_link): 
Get the fine-tune curl

	-- NLP_sim._table_check_(F_data,S_data,sim): 
通过参考表进行人工检测输出结果检验,使用扩大因数,应要求已暂时禁用

	-- NLP_sim.Get_SimMatrix(type,F_data,S_data,savefilename): 
Input two sets of data to obtain sim_matrix,type表示是否需要进行相似度的归一化计算,sacefilename为保存结果路径

	-- NLP_sim.Select_Scenario(F_data,SS_data,sim,k1,k2,b,savefilename):
调用上述人工检查多路召回方法进一步提升选出scenario的可靠性。F_data和SS_data为模型的feature与所有可选scenario,sim为Get_SimMatrix计算相似度矩阵结果,k1、k2、b为BM2.5模型筛选所需参数,取值参考:https://zhuanlan.zhihu.com/p/79202151,savefilename为结果保存路径。

	-- NLP_sim.Fine_tune(Feature_list,Scenario_list,Feature_eval,Scenario_eval,epoch): 
微调模型,Feature_list,Scenario_list,Feature_eval,Scenario_eval分别为微调使用的训练与测试数据,epoch为迭代次数

	-- NLP_sim.Pre_train(train_sentences,dev_sentences,pretrain_config,save_path):
预训练方法。已有研究表明,预训练需要大量的数据与训练资源支持才有较好效果,而受限于行业公开数据资源的限制,这里的预训练代码效果可能不佳,在补充更多数据后可能有更好效果,因此补充的预训练代码模块仅作为参考保留。train_sentences是预训练过程使用训练数据,dev_sentences是预训练过程使用验证数据,pretrain_config是预训练过程相关参数,save_path是预训练过程保存文件夹路径,不能含有英文。