基于规则嵌入的论文比对系统(5)-数据处理2

环境

python3 keras=2.0.6

思路

这里主要是对后面将要的构建的模型的输入进行处理。

我们的系统的核心功能是对于输入的论文集合分别在5个子空间(0.研究背景 1.研究问题 2.贡献 3.方法 4.实验)上输出相似的论文对,从而实现更细粒度的论文之间的比较。

所以对于 模型输入 ,应该是对于一个论文对的序列化表示,这里我将其设计成 语义规则 的拼接,关于这两部分的具体介绍后续博客会详细说明。

还有一个问题就是,我们的系统从本质上来说应该是一个有监督的 分类 问题,但是我们当前所拥有的数据集是没有 label 的数据的,也就是我们不知道在某个子空间上,输入的这个论文对到底是属于正样本对,还是负样本对,所以需要我们人工的在5个子空间上进行训练集的构建。

该博客主要延续上一篇 训练集的构建

构建训练集

在上一篇 基于规则嵌入的论文比对系统(4) 中,已经将 sentence_textcnn.json 的数据进行了初步处理,得到了在5个子空间(0.研究背景 1.研究问题 2.贡献 3.方法 4.实验)上经过sentence融合的字典(key是paper_id,item是融合之后的sentence),接下来将在此基础上进行处理。

注意:每篇论文并不是每个子空间都有,每个子空间也不一定只有一个句子。

计算文本相似度的类

算法说明

在计算文本相似度时,我们使用TF-IDF模型。

tf即词频term frequency,表示词w在文档d中出现次数count(w,d)和文档d中总词数size(d)的比值:

在这里插入图片描述
idf即逆文档频率inverse document frequency,表示文档总数n和词w所出现文件数docs(w,d)比值的对数:
在这里插入图片描述
根据
在这里插入图片描述

作为权重来将每一篇文档表示为一个权重向量,并根据余弦相似度作为文档之间的相似度。

注意:这里就是将每篇论文每个子空间上的sentence都作为一个doc.

tf-idf部分参考资料

tf-idf模型参考对象

代码

class DocumentSimilar(object):
    def __init__(self, documents):
        self.documents = documents
        self.dictionary = None
        self.tfidf = None
        self.similar_matrix = None
        self.calculate_similar_matrix()
    @staticmethod
    def split_word(document):
        """
        分词,去除停用词
        """
        text=document.split(" ")
        return text
    def calculate_similar_matrix(self):
        """
        计算相似度矩阵及一些必要数据
        """ 
        words = [self.split_word(document) for document in self.documents]
        self.dictionary = corpora.Dictionary(words)
        corpus = [self.dictionary.doc2bow(word) for word in words]
        self.tfidf = models.TfidfModel(corpus)
        corpus_tfidf = self.tfidf[corpus]
        self.similar_matrix = similarities.Similarity("",corpus_tfidf,len(self.dictionary))
     def get_similar(self, document):
        """
        计算要比较的文档与语料库中每篇文档的相似度
        """
        words = self.split_word(document)
        corpus = self.dictionary.doc2bow(words)
        corpus_tfidf = self.tfidf[corpus]
        return self.similar_matrix[corpus_tfidf]
    

计算列表中第二大的数

def SecMax(list):
    list.sort()
    count=list.count(list[len(list) - 1] )
    c = 0
    while c < count:
        list.pop()
        c+=1
    return list[len(list) - 1]    
    

根据上面的文本相似度的类,在每个子空间上计算出论文对之间的相似度,为每篇论文找出和它最相似的论文

代码

#子空间0
documents0=[]
index_list0=[]
for key,value in SubSpace0_dict.items():
    index_list0.append(key)
    documents0.append(value)
SubSpace0_train_pairs=[]
SubSpace0_train_pairs_=[]
doc_similar0=DocumentSimilar(documents0)
for key,value in SubSpace0_dict.items():
    a=key
    temp=list(doc_similar0.get_similar(value))
    temp_=temp.copy()
    Second_Num=SecMax(temp_)
    min_num=min(temp)
    Second_Maxnum_Index=temp.index(Second_Num)
    min_num_index=temp.index(min_num)
    c=index_list0[min_num_index]
    b=index_list0[Second_Maxnum_Index]
    SubSpace0_train_pairs.append([a,b,Second_Num])
    SubSpace0_train_pairs_.append([a,c,min_num])

#子空间1
documents1=[]
index_list1=[]
for key,value in SubSpace1_dict.items():
    index_list1.append(key)
    documents1.append(value)
SubSpace1_train_pairs=[]
SubSpace1_train_pairs_=[]
doc_similar1=DocumentSimilar(documents1)
for key,value in SubSpace1_dict.items():
    a=key
    temp=list(doc_similar1.get_similar(value))
    temp_=temp.copy()
    Second_Num=SecMax(temp_)
    min_num=min(temp)
    Second_Maxnum_Index=temp.index(Second_Num)
    min_num_index=temp.index(min_num)
    c=index_list1[min_num_index]
    b=index_list1[Second_Maxnum_Index]
    SubSpace1_train_pairs.append([a,b,Second_Num])
    SubSpace1_train_pairs_.append([a,c,min_num])

#子空间2
documents2=[]
index_list2=[]
for key,value in SubSpace2_dict.items():
    index_list2.append(key)
    documents2.append(value)

SubSpace2_train_pairs=[]
SubSpace2_train_pairs_=[]
doc_similar2=DocumentSimilar(documents2)
for key,value in SubSpace2_dict.items():
    a=key
    temp=list(doc_similar2.get_similar(value))
    temp_=temp.copy()
    Second_Num=SecMax(temp_)
    min_num=min(temp)
    Second_Maxnum_Index=temp.index(Second_Num)
    min_num_index=temp.index(min_num)
    c=index_list2[min_num_index]
    b=index_list2[Second_Maxnum_Index]
    SubSpace2_train_pairs.append([a,b,Second_Num])
    SubSpace2_train_pairs_.append([a,c,min_num])

#子空间3
documents3=[]
index_list3=[]
for key,value in SubSpace3_dict.items():
    index_list3.append(key)
    documents3.append(value)
SubSpace3_train_pairs=[]
SubSpace3_train_pairs_=[]
doc_similar3=DocumentSimilar(documents3)

for key,value in SubSpace3_dict.items():
    a=key
    temp=list(doc_similar3.get_similar(value))
    temp_=temp.copy()
    Second_Num=SecMax(temp_)
    min_num=min(temp)   
    Second_Maxnum_Index=temp.index(Second_Num)
    min_num_index=temp.index(min_num)
    c=index_list3[min_num_index]   
    b=index_list3[Second_Maxnum_Index]
    SubSpace3_train_pairs.append([a,b,Second_Num])
    SubSpace3_train_pairs_.append([a,c,min_num])

#子空间4
documents4=[]
index_list4=[]
for key,value in SubSpace4_dict.items():
    index_list4.append(key)
    documents4.append(value)
SubSpace4_train_pairs=[]
SubSpace4_train_pairs_=[]
doc_similar4=DocumentSimilar(documents4)

for key,value in SubSpace4_dict.items():
    a=key
    temp=list(doc_similar4.get_similar(value))
    temp_=temp.copy()
    Second_Num=SecMax(temp_)
    min_num=min(temp)   
    Second_Maxnum_Index=temp.index(Second_Num)
    min_num_index=temp.index(min_num)  
    c=index_list4[min_num_index]   
    b=index_list4[Second_Maxnum_Index]
    SubSpace4_train_pairs.append([a,b,Second_Num])
    SubSpace4_train_pairs_.append([a,c,min_num])

运行结果可视化展示
前两列是两篇论文的paper_id,最后一列是在某个子空间上的文本相似度

  • 子空间0(正样本)
    在这里插入图片描述
  • 子空间0(负样本)
    在这里插入图片描述
  • 子空间1(正样本)
    在这里插入图片描述
  • 子空间1(负样本)
    在这里插入图片描述
  • 子空间2(正样本)
    在这里插入图片描述
  • 子空间2(负样本)
    在这里插入图片描述
  • 子空间3(正样本)
    在这里插入图片描述
  • 子空间3(负样本)
    在这里插入图片描述
  • 子空间4(正样本)
    在这里插入图片描述
  • 子空间4(负样本)
    在这里插入图片描述

运行上面的代码时间很长,所以可以把得到的列表存起来(例如子空间0的相关数据存储)

SubSpace0_train_pairs=np.array(SubSpace0_train_pairs)
np.save('data/SubSpace0_train_pairs+.npy',SubSpace0_train_pairs)
SubSpace0_train_pairs=np.load('data/SubSpace0_train_pairs+.npy')
SubSpace0_train_pairs=SubSpace0_train_pairs.tolist()

在每个子空间挑出100个作为正样本对,100个作为负样本对

挑选方案:正样本,选择相似度最高的100对;负样本,选择相似度最低的100对

代码

#子空间0
#100个正样本对
list0=[each[-1] for each in SubSpace0_train_pairs]
array0=np.array(list0)
Max100_0=list(array0.argsort()[-100:][::-1])
Max100_0_pos=[]
for each in Max100_0:
    temp=[]
    temp_li=SubSpace0_train_pairs[int(each)]
    temp.append(int(temp_li[0]))
    temp.append(int(temp_li[1]))
    Max100_0_pos.append(temp)
#100个负样本对
list0_=[each[-1] for each in SubSpace0_train_pairs_]
array0_=np.array(list0_)
Min100_0_=list(array0_.argsort()[:100][::])
Min100_0_neg=[]
for each in Min100_0_:
    temp=[]
    temp_li=SubSpace0_train_pairs_[int(each)]
    temp.append(int(temp_li[0]))
    temp.append(int(temp_li[1]))
    Min100_0_neg.append(temp)


#子空间1
#100个正样本对
list1=[each[-1] for each in SubSpace1_train_pairs]
array1=np.array(list1)
Max100_1=list(array1.argsort()[-100:][::-1])
Max100_1_pos=[]
for each in Max100_1:
    temp=[]
    temp_li=SubSpace1_train_pairs[int(each)]
    temp.append(int(temp_li[0]))
    temp.append(int(temp_li[1]))
    Max100_1_pos.append(temp)
#100个负样本对
list1_=[each[-1] for each in SubSpace1_train_pairs_]
array1_=np.array(list1_)
Min100_1_=list(array1_.argsort()[:100][::])
Min100_1_neg=[]
for each in Min100_1_:
    temp=[]
    temp_li=SubSpace1_train_pairs_[int(each)]
    temp.append(int(temp_li[0]))
    temp.append(int(temp_li[1]))
    Min100_1_neg.append(temp)

#子空间2
#100个正样本对
list2=[each[-1] for each in SubSpace2_train_pairs]
array2=np.array(list2)
Min100_2=list(array2.argsort()[-100:][::-1])
Min100_2_pos=[]
for each in Min100_2:
    temp=[]
    temp_li=SubSpace2_train_pairs[int(each)]
    temp.append(int(temp_li[0]))
    temp.append(int(temp_li[1]))
    Min100_2_pos.append(temp)
#100个负样本对
list2_=[each[-1] for each in SubSpace2_train_pairs_]
array2_=np.array(list2_)
Min100_2_=list(array2_.argsort()[:100][::])
Min100_2_neg=[]
for each in Min100_2_:
    temp=[]
    temp_li=SubSpace2_train_pairs_[int(each)]
    temp.append(int(temp_li[0]))
    temp.append(int(temp_li[1]))
    Min100_2_neg.append(temp)

#子空间3
#100个正样本对
list3=[each[-1] for each in SubSpace3_train_pairs]
array3=np.array(list3)
Max100_3=list(array3.argsort()[-100:][::-1])
Max100_3_pos=[]
for each in Max100_3:
    temp=[]
    temp_li=SubSpace3_train_pairs[int(each)]
    temp.append(int(temp_li[0]))
    temp.append(int(temp_li[1]))
    Max100_3_pos.append(temp)
#100个负样本对
list3_=[each[-1] for each in SubSpace3_train_pairs_]
array3_=np.array(list3_)
Min100_3_=list(array3_.argsort()[:100][::])
Min100_3_neg=[]
for each in Min100_3_:
    temp=[]
    temp_li=SubSpace3_train_pairs_[int(each)]
    temp.append(int(temp_li[0]))
    temp.append(int(temp_li[1]))
    Min100_3_neg.append(temp)

#子空间4
#100个正样本对
list4=[each[-1] for each in SubSpace4_train_pairs]
array4=np.array(list4)
Max100_4=list(array4.argsort()[-100:][::-1])
Max100_4_pos=[]
for each in Max100_4:
    temp=[]
    temp_li=SubSpace4_train_pairs[int(each)]
    temp.append(int(temp_li[0]))
    temp.append(int(temp_li[1]))
    Max100_4_pos.append(temp)
#100个负样本对
list4_=[each[-1] for each in SubSpace4_train_pairs_]
array4_=np.array(list4_)
Min100_4_=list(array4_.argsort()[:100][::])
Min100_4_neg=[]
for each in Min100_4_:
    temp=[]
    temp_li=SubSpace4_train_pairs_[int(each)]
    temp.append(int(temp_li[0]))
    temp.append(int(temp_li[1]))
    Min100_4_neg.append(temp)

运行结果可视化展示

  • 子空间0(100个正样本对)
    在这里插入图片描述
  • 子空间0(100个负样本对)
    在这里插入图片描述
  • 子空间1(100个正样本对)
    在这里插入图片描述
  • 子空间1(100个负样本对)
    在这里插入图片描述
  • 子空间2(100个正样本对)
    在这里插入图片描述
  • 子空间2(100个负样本对)
    在这里插入图片描述
  • 子空间3(100个正样本对)
    在这里插入图片描述
  • 子空间3(100个负样本对)
    在这里插入图片描述
  • 子空间4(100个正样本对)
    在这里插入图片描述
  • 子空间4(100个负样本对)
    在这里插入图片描述

总结

至此,已经得到了在5个子空间上的训练样本。整个数据处理过程中最经常报的错误就是out of index的错误,但是基本上根据错误提示信息都能很快找到报错的位置,总体来说比较顺利。

下一步就是对于输入文本进行序列化的处理,规则的嵌入,以及模型的构建。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值