说明
在和老师交流讨论之后,我们又发现了我们整个项目还存在一些不足之处,所以这两天又在原来的基础上做了一些调整。
项目调整的几个方面(写的比较简略)
- 两个规则(全局的keywords+局部的提取的keywords)的修改,之前只是简单的计算杰卡德相似度,现在要改成语义相关的
- loss函数修改
- 可视化-子空间sentence的highlight
- 规则嵌入的模型和无规则嵌入的模型的比较
- ccs树修改
我主要负责重新生成训练集,在搭建一个无规则嵌入的模型的部分
这篇博客主要介绍一下重新构建训练集的函数代码
思路
之前生成的训练集单纯的只是根据文本相似度生成的训练集,这次是融合了四个规则,考虑五个方面进行数据集的构建,四个规则分别是:
- 参考文献的相似度
- 关键词相似度(全局)
- ccs分类相似度
- 子空间提取的关键词相似度(局部)
每个规则各占0.15的比例,文本相似度占0.4的比例。
在每个子空间上,为每个论文寻找一个和它相似的正样本,和四个和他不相似的负样本。总共选取了40租,200对。
说明:重新构建训练集的实践非常长,因为需要遍历的计算,在每个子空间上重新生成一个新的训练集都需要将近10个小时左右,所以在这里花费了非常多的时间。
代码
def train_pairs_pos_neg(SubSpace_dict,subid):
documents=[]
index_list=[]
for key,value in SubSpace_dict.items():
index_list.append(key)
documents.append(value)
SubSpace_train_pairs=[]
doc_similar=DocumentSimilar(documents)
sub_item=list(SubSpace_dict.items())[:40]
for key,value in sub_item:
a=key
temp=list(doc_similar.get_similar(value))
i=index_list.index(a)
for j in tqdm(range(len(temp))):
rules_list=rulesEmbbeding(index_list[i],index_list[j],subid)
temp[j]=0.4*temp[j]+0.15*rules_list[0]+0.15*rules_list[1]+0.15*rules_list[2]+0.15*rules_list[3]
pass
temp_=temp.copy()
Second_Num=SecMax(temp_)
Second_Maxnum_Index=temp.index(Second_Num)
b=index_list[Second_Maxnum_Index]
SubSpace_train_pairs.append([a,b,Second_Num])
min_num_index_list = list(map(temp.index, heapq.nsmallest(4, temp)))
for each in min_num_index_list:
print(min_num_index_list)
SubSpace_train_pairs.append([a,index_list[each],temp[each]])
return SubSpace_train_pairs
遇到问题
- 问题一
重新生成完了所有的训练集之后发现,模型训练的时候,预测准确率越来越小,非常奇怪。
后来找了半天,发现是其中一个规则函数的问题。有一个规则函数的返回值可能是nan,就导致输入模型的序列话数据中存在nan,这是不正确的,所以我就修改了一下这个函数最终解决了问题。
圈红圈的部分是我在队友发来的代码上修改的地方,从而解决了返回值存在nan值的问题。
- 问题二
当函数不在大量的数据上测试的时候往往难以发现它的bug,因为我要将队友们负责的规则部分的函数部分和我搭建模型整合起来,在模型训练的时候,因为涉及到的数据比较多,就增加了报错的可能性,所以我就需要对这些规则函数做调整:
红框的部分是我调整的部分。
把文件的读取都挪到了函数之外,这样就避免了后面重复的读取这些文件,从而可以提高速度。