6-19 论文相似度探索
相同子空间中论文之间的相似性与三种特征相关:
① CCS分类的相似度;
② reference的相似程度;
② 在该子空间上的文本中关键词的相似度。
针对上述三种特征,参考BabbleLabble设计基于规则嵌入的深度模型,优化目标包括CCS分类中公共父节点的距离、reference的杰卡德相似系数、从子空间的文本中提取出的关键词的杰卡德相似系数。
论文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,系统后台先自动筛选出一个论文集合,然后在这个集合上,计算论文不同子空间上的相似度,然后输出相似的论文对。
能不能让用户有两种选择方式,增加一种关键词筛选,即用户输入一个关键词,根据关键词筛选出一个论文集合,然后在这个集合上比较论文之间的相似度?因为某一年某个会议的论文可能涉及很多不同的研究方向,从用户角度考虑,如果用户是想要查找某一特定研究方向的论文,然后查看这些论文在不同的子空间上的相似度(研究背景、研究问题、贡献、方法、实验),直接让用户选择关键词好像实用性更强?如果是选择年份和会议,筛选出来的很多论文对可能涉及不同的领域,然后用户需要再根据关键词进行筛选。而且同一个研究方向肯定在不同的年份和不同的会议/期刊上都有。
(只是随便想想,丰富系统功能?好像用处不大…)