基于规则嵌入的论文比对系统——创新实训记录8

6-19 论文相似度探索

原有论文的相似度计算方法

相同子空间中论文之间的相似性与三种特征相关:
  ① CCS分类的相似度;
  ② reference的相似程度;
  ② 在该子空间上的文本中关键词的相似度。
  针对上述三种特征,参考BabbleLabble设计基于规则嵌入的深度模型,优化目标包括CCS分类中公共父节点的距离、reference的杰卡德相似系数、从子空间的文本中提取出的关键词的杰卡德相似系数。

ACM数据集现有数据

论文Id,论文摘要、作者的单位、论文作者、论文的标签(CCS分类)、引用关系、论文关键词、论文题目、年份、会议/期刊。

大概想法(就先试一下)

利用论文关键词数据,①计算关键词集合的杰卡德相似度 ②计算关键词词语相似度
  效果:给定两篇论文的id,输出一个数值,该数值表示两篇论文的关键词相似度。该数值可以作为全局上的相似度,作为最后模型输入的一部分。
  首先进行数据预处理,形成一个key_list,二维列表,第二维对应一篇论文的关键词(词组形式)。形成一个word_list,二维列表,第二维对应一篇论文的关键词(单词形式)。构建一个字典,id与list下标的对应关系。

# 数据预处理,形成key_list

key_path = 'D:/大学资料/大三下/项目实训/code+data/ACM数据集/keywords.txt'
key_file = open(key_path,'r')

key_list = []
word_list =[]
i = 0
for line in key_file:
    key = line.strip().split('\t')
    word = line.strip().split()
    key_list.append(key)
    word_list.append(word)

print(key_list[:2])
print(word_list[:2])

# 构建一个字典,id与list下标的对应关系
id_path = 'D:/大学资料/大三下/项目实训/code+data/ACM数据集/articles.log'
id_file = open(id_path,'r')
i = 0
id_dic = {}
for line in id_file.readlines():
    id = line.split()[1]
    id_dic[id] = i
    i +=1
print(len(id_dic))

然后定义相应的函数。
① 计算关键词集合的杰卡德相似度

# 定义jaccard函数,参数为两篇论文id,返回jaccard相似度

def getJacccard(id1,id2):
    # 注:id必须是string类型
    id1 = str(id1)
    id2 = str(id2)
    keywords1 = set(key_list[id_dic[id1]])
    keywords2 = set(key_list[id_dic[id2]])
    temp = 0
    for i in keywords1:
        if i in keywords2:
            temp = temp+1
    fenmu = len(keywords1)+len(keywords2)-temp #并集
    jaccard_coefficient=float(temp/fenmu)#交集
    return jaccard_coefficient

测试:
在这里插入图片描述
② 计算关键词词语相似度
  利用gensim的word2vec训练词向量,保存模型。求关键词相似度,想了一种比较简单的方法,就是求某篇论文关键词的平均词向量,用平均词向量表示论文的关键词特征。然后利用余弦相似度计算两篇论文关键词的相似度。

# 利用word2vec计算词语相似度?
#encoding=utf-8
from gensim.models import word2vec
import gensim
import numpy as np
from scipy.linalg import norm

sentences=word2vec.Text8Corpus(u'D:/大学资料/大三下/项目实训/code+data/ACM数据集/keywords.txt')
model=word2vec.Word2Vec(sentences, size=64,min_count=1)
model.save("D:/大学资料/大三下/项目实训/code+data/ACM数据集/keywords.vector")

y2=model.wv.similarity(u"hypermedia", u"hypertext")
print(y2)

def vector_similarity(s1, s2):
    def sentence_vector(s):
        v = np.zeros(64)
        for word in s:
            v += model[word]
        v /= len(s)
        return v

    v1, v2 = sentence_vector(s1), sentence_vector(s2)
    return np.dot(v1, v2) / (norm(v1) * norm(v2))

s1 = ['cs','hypertext','personalization']
s2 = ['digital','information','web']
print(vector_similarity(s1,s2))

定义函数:

def getSimi(id1,id2):
    id1 = str(id1)
    id2 = str(id2)
    keywords1 = set(word_list[id_dic[id1]])
    keywords2 = set(word_list[id_dic[id2]])
    simi = vector_similarity(keywords1,keywords2)
    return simi

测试:
在这里插入图片描述
两个数值怎么结合我还没有想好…

其他想法

我们的系统设定是用户输入year、venue,系统后台先自动筛选出一个论文集合,然后在这个集合上,计算论文不同子空间上的相似度,然后输出相似的论文对。
  能不能让用户有两种选择方式,增加一种关键词筛选,即用户输入一个关键词,根据关键词筛选出一个论文集合,然后在这个集合上比较论文之间的相似度?因为某一年某个会议的论文可能涉及很多不同的研究方向,从用户角度考虑,如果用户是想要查找某一特定研究方向的论文,然后查看这些论文在不同的子空间上的相似度(研究背景、研究问题、贡献、方法、实验),直接让用户选择关键词好像实用性更强?如果是选择年份和会议,筛选出来的很多论文对可能涉及不同的领域,然后用户需要再根据关键词进行筛选。而且同一个研究方向肯定在不同的年份和不同的会议/期刊上都有。
  (只是随便想想,丰富系统功能?好像用处不大…)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值